【问题标题】:mod_rewrite: match string within URL, which regex to chose?mod_rewrite:匹配 URL 中的字符串,选择哪个正则表达式?
【发布时间】:2014-07-23 11:19:24
【问题描述】:

我想使用 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(.*)$ 有效。

我在这里错过了什么?

【问题讨论】:

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


    【解决方案1】:
    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等。

    【讨论】:

    • 谢谢! (^|&)($|&) 是干什么用的?
    • 我将此添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多