mod_rewrite中的URL编码问题

时间:2013-12-04 17:38:35

标签: .htaccess mod-rewrite

所以我正在制作一种代理类型的东西,我需要使用我的.htaccess文件对所有的get查询进行编码。基本上我想默默地重定向:

http://example.com/p/external.php?foo=bar

为:

http://example.com/proxy.php?path=external.php%3Ffoo=bar

除了以下代码行似乎不是这样:

RewriteRule ^p/(.*)$ /proxy.php?path=$1

我已经尝试过使用B标志和NE标志,但似乎两者之间没有任何差异,之前是什么?被传递但没有别的。

2 个答案:

答案 0 :(得分:1)

通用规则B标志一起使用

RewriteCond %{THE_REQUEST} \s/+p/[^?]+\?([^\s]+) [NC]
RewriteRule ^p/(.+?)\.php$ /proxy.php?path=$1.php\%3F%1 [L,NC,B]

这将使用

/p/external.php?foo=bar&abc=123重写为/proxy.php
_SERVER["QUERY_STRING"]=path=external.php%3Ffoo%3dbar%26abc%3d123

答案 1 :(得分:0)

您需要包含%{QUERY_STRING}变量:

RewriteCond %{QUERY_STRING} ^(.*)&(.*)$ 
RewriteRule ^p/ %{REQUEST_URI}?%1\%26%2[L,NE]  

RewriteRule ^p/(.*)$ /proxy.php?path=$1\%3F%{QUERY_STRING}

因为它不是规则模式匹配的一部分,并且不会被(.*)捕获。