通过 htaccess RewriteRule 在 url 中添加“?”

add " ? " in url via htaccess RewriteRule

我尝试在 htaccess 中使用 RewriteRule

我想要我的url

site.com/f_search.php?langs=en&langs=en

效果像

site.com/en/new.php?/en/f_search

我在 htaccess 中使用了这段代码

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/?/new.php+?+/([^/]*)/?/f_search/?$ f_search.php?langs=&langs=

但它不适用于“?”

如果我将 new.php+?+ 更改为 new.php+@+

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/?/new.php+@+/([^/]*)/?/f_search/?$ f_search.php?langs=&langs=

效果不错

site.com/en/new.php@/en/f_search

有什么想法可以将 @ 更改为 ?在我的 url ???

谢谢

问号和后面的内容 不是 主题的一部分,RewriteRule 的模式与之匹配。这是明确记录的。相反,您需要使用 RewriteCond 来访问查询字符串的内容。

我想这大概就是您要查找的内容,但您可能需要对其进行调整以符合您的实际情况:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^/([a-z]+)/f_search$
RewriteRule ^/?(?:([a-z]+)/)?new\.php$ /f_search.php?langs=&langs=%1

从你的问题来看,不清楚重写目标中参数“langs”的两个值应该从哪里获取。因此,您可能需要根据规则中的需要进行调整。

同样令人费解的是,您试图将该参数设置为“langs”两次 ...这毫无意义,第二次尝试只会覆盖第一次的值尝试将这些值移交给基于 php 的逻辑。

apache http服务器重写模块的文档提供了很多准确的帮助和很好的例子:https://httpd.apache.org/docs/current/mod/mod_rewrite.html

最终代码

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([a-z]+)/new.php$ f_search.php?langs= [L,NC]