首页 文章

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

提问于
浏览
0

我想使用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 回答

  • 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 等 .

相关问题