mod_rewrite:仅对URL中的某些匹配进行编码

时间:2014-07-23 13:08:40

标签: apache .htaccess mod-rewrite url-rewriting urlencode

我正在尝试使用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有关,我试图在括号内捕获文字。

1 个答案:

答案 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