mod_rewrite: match string within URL, which regex to chose?

允我心安 提交于 2019-12-25 02:30:05

问题


I would like to use mod_rewrite to capture a string within brackets in my URL and do a redirect.

My URL:

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

my .httaccess file with the regex:

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

I just would like to capture what's in between the round brackets, so my redirect should look something like this: somedir/B

I test my regex at http://htaccess.madewithlove.be/ but I get no match.

I don't know what I am missing here, even if I try much simpler regexes, e.g. .+var_b(.*)$ I get no match. Only if my regex was looking for a pattern at the beginning, I get a match, so for example the regex something(.*)$ works.

What am I missing here?


回答1:


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

The reason is that RewriteRule does not receive the ?x=y part of the query. The %2 variable refers to the pattern from the last RewriteCond, while $2 would refer to the pattern from this RewriteRule. The ? at the end prevents the query part ?x=y from being automatically appended at the end of the result.

The (^|&) and (&|$) in the pattern guarantee that var_b=(B) is the complete parameter and not a part of it. Without these, the pattern would also match ?xyzvar_b=(B) or ?var_b=(B)xyz. With these, it will only match ?var_b=(B) or ?a=b&var_b=(B)&x=z etc.



来源:https://stackoverflow.com/questions/24909087/mod-rewrite-match-string-within-url-which-regex-to-chose

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!