mod_rewrite:匹配URL中的字符串,选择哪个正则表达式?

时间:2014-07-23 11:19:25

标签: regex apache web-services mod-rewrite redirect

我想使用mod_rewrite在我的URL中的括号内捕获一个字符串并进行重定向。

我的网址:

something?var_a=A&var_b=(B)&var_c=C

带有正则表达式的.httaccess文件:

RewriteEngine on
RewriteRule ^/?.+var_b=\((.*)\)$ somedir/$1 [R]

我只想捕捉圆括号之间的内容,因此我的重定向应如下所示:somedir/B

我在http://htaccess.madewithlove.be/测试我的正则表达式,但我得不到匹配。

我不知道我在这里缺少什么,即使我尝试了更简单的正则表达式,例如.+var_b(.*)$我得不到匹配。只有当我的正则表达式在开头寻找模式时,我才会得到一个匹配,所以例如正则表达式something(.*)$可以工作。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

RewriteEngine On
RewriteCond %{QUERY_STRING} (^|&)var_b=\((.*?)\)(&|$) [NC]
RewriteRule ^.*$ somedir/%2? [R]

原因是RewriteRule没有收到查询的?x=y部分。 %2变量引用上一个RewriteCond的模式,而$2则引用此RewriteRule中的模式。最后的?会阻止查询部分?x=y自动附加到结果的末尾。

模式中的(^|&)(&|$)保证var_b=(B)是完整参数,而不是其中的一部分。如果没有这些,模式也会匹配?xyzvar_b=(B)?var_b=(B)xyz。有了这些,它只会匹配?var_b=(B)?a=b&var_b=(B)&x=z等。