.htaccess mod_重写中的URL编码问题

.htaccess mod_重写中的URL编码问题,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,因此,我正在做一种代理类型的事情,我需要使用.htaccess文件对所有get查询进行编码。基本上我想悄悄地重定向: http://example.com/p/external.php?foo=bar 致: 但以下代码行似乎不是这样: RewriteRule ^p/(.*)$ /proxy.php?path=$1 我试过使用B标志和NE标志,但它们似乎都没有区别,在使用之前有什么区别吗?已传递,但没有传递任何其他内容。您需要包含%{QUERY\u STRING}变量: RewriteCond

因此,我正在做一种代理类型的事情,我需要使用.htaccess文件对所有get查询进行编码。基本上我想悄悄地重定向:

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

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

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

我试过使用B标志和NE标志,但它们似乎都没有区别,在使用之前有什么区别吗?已传递,但没有传递任何其他内容。

您需要包含
%{QUERY\u STRING}
变量:

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

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

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

捕获,所以请使用
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

这很好地捕获了我想要的第一个参数,但是关于第二个和第三个参数?我应该如何确保&标志是url编码的,因此不被视为我工作的一部分url@cainy393请参见编辑,在发送到proxy.php文件之前,您需要首先对查询字符串进行编码。这允许我传递每个参数,如果我在PHP中重新构造查询字符串并将其附加到路径字符串中,这将起作用。但是,如果可能的话,最好对整个路径进行url编码,并将其作为一个变量传递。Apache会自动对目标URI应用url编码,因此我建议您利用该功能并保持简单。确定您可以尝试:
RewriteRule^p/(.+)$/proxy.php?path=$1[L,QSA,NE]
btw当我输入这个URL时:
/p/external.php?foo=bar&abc=123
根据上面的规则,我得到了
\u服务器[“QUERY\u STRING”]=“path=external.php&foo=bar&abc=123”
这是不可接受的吗?这是我目前正在处理的问题,但我更愿意将/p/external.php?foo=bar&abc=123转换为proxy.php?path=external.php%3Ffoo%3Dbar%26abc%3D123,据我所知,这是默认情况下应该发生的事情,但事实并非如此,我感到非常困惑
_SERVER["QUERY_STRING"]=path=external.php%3Ffoo%3dbar%26abc%3d123