如何匹配.htaccess中的问号

时间:2016-05-04 04:42:43

标签: regex .htaccess

我的.htaccess

中有以下正则表达式
zip     freq     office
----    ----     ----
92101    450     office_A, office_B
02124    300     office_A, office_C, office_D
07713    110     office_B

我期待,如果我提供RewriteRule ^([a-z]+)/([a-z]+)/\?(.+)$ ./default.php?controller=$1&action=$2&$3 这样的网址,它会被翻译为mysite.com/controller/action/?v=2

然而,它不起作用。我试着做了

mysite.com/default.php?controller=controller&action=action&v=1

RewriteRule ^([a-z]+)/([a-z]+)/[?](.+)$ ./default.php?controller=$1&action=$2&$3

没有用。然后我试着更换? (问号)由x

RewriteRule ^([a-z]+)/([a-z]+)/[\?](.+)$ ./default.php?controller=$1&action=$2&$3

并尝试传递RewriteRule ^([a-z]+)/([a-z]+)/x(.+)$ ./default.php?controller=$1&action=$2&$3

之类的网址

这与预期一样有效。我试过测试我的正则表达式似乎没问题。我做错了什么?

2 个答案:

答案 0 :(得分:3)

规则本身未检测到查询字符串。作为参考,需要使用检查QUERY_STRING的值的单独条件来检查这些。

但是,您实际上不需要在您的情况下执行此操作,因为您只需要使用QSA(查询字符串追加)标记将v=1查询参数附加到新URI。 / p>

RewriteRule ^([^/]+)/([^/]+)/$ default.php?controller=$1&action=$2 [QSA,L]

现在,在请求/mycontroller/myaction/?v=1时,Apache将提供default.php?controller=mycontroller&action=myaction&v=1

如果您想将最后一个尾部斜线设为可选,请在其后面添加一个问号(^([^/]+)/([^/]+)/?$)。

作为参考,[^/]+表示“一个或多个不是正斜杠的字符”。

答案 1 :(得分:1)

查询字符串不会直接在RewriteRule中解释,但是,您可以轻松地将其附加到最后。

试试这个:

RewriteRule ^([a-z]+)/([a-z]+)/$ ./default.php?controller=$1&action=$2&%{QUERY_STRING}