问题
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