我正在尝试使用mod_rewrite重写一个URL,并在我的URL中编码一个子括号中的子字符串。我的网址:
http://localhost/something?var_a=A&var_b=(B&2/3&)&var_c=C
和我的.htaccess:
RewriteEngine On
RewriteCond %{QUERY_STRING} (.+)\((.*?)\)(.+)
RewriteRule ^.*$ somedir/%1%2%3? [R,B]
所以我捕获了三个字符串,括号前的任何内容,内部的任何内容以及之后的任何内容。
结果是:
somedir/var_a%3dA%26var_b%3dB%262%2f3%26%26var_c%3dC
但我想只编码我的初始网址括号内的文字,例如
somedir/var_a=A&var_b=dB%262%2f3%26&var_c=C
问题似乎是[B]
选项解码整个字符串。有没有办法有选择地这样做?此外,我的解决方案只能捕获一次括号的出现,这将是更好的通用;有人能给我一个提示吗?
请注意,此问题与我的previous one有关,我试图在括号内捕获文字。
答案 0 :(得分:0)
这对于mod_rewrite
来说非常棘手,但是我对它进行了一次拍摄。解决方案并不漂亮,因为它涉及2个重定向和使用cookie,但它可以工作。
RewriteEngine On
# store non bracket query string in cookie while redirecting value in brackets using B flag
RewriteCond %{QUERY_STRING} ^(.+?&)?(var_b=)\(([^)]*)\)(.*)$ [NC]
RewriteRule !^somedir/ /somedir/%3? [L,CO=QS:%1-%2-%4:%{HTTP_HOST},B,R]
# retrieve value from cookie and use it to construct full URL
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_COOKIE} QS=([^-]*)-([^-]+)-([^;]+) [NC]
RewriteRule ^(somedir)/(.*)$ /$1/%1%2$2%3? [L,R,NE]
访问此网址时使用这些规则:http://localhost/something?var_a=A&var_b=(B&2/3&)&var_c=C
它会被重定向到:http://localhost/somedir/var_a=A&var_b=B%262%2f3%26&var_c=C