我想在我的网址中不使用&符号,这样我就可以在请求文件时将&符号进一步传入我的系统。问题是Apache以不同的方式处理它。我不知道如何
我已经将所请求的文件重写为index.php?url = $ 1所以我可以看到它是什么,但如果它有一个&符号,它就不能继续经过它了!
如何逃脱&符号或将其转换为十六进制等于(%26)?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>`
答案 0 :(得分:4)
首先确保你正在建造的网址已经逃脱了&amp;符号到%26所以当它到达你的服务器时它不是一个&符号。然后在你的重写规则中添加B标记,这样它就不会将它转换回&amp;:
RewriteRule ^(。*)$ index.php?url = $ 1 [B,QSA,L]
这个B标签在尝试不同的重写规则2天后保存了我的屁股。
答案 1 :(得分:1)
添加
RewriteRule ^(.*)\&(.*)$ $1\%26$2
改写你的重写规则。
答案 2 :(得分:1)
在mod_rewrite
修改的查询字符串中转义&符号的正确方法是
%2526
如果它由php处理。
当apache重写它时,它从%2526
转到%26
然后php转换为&
并存储在查询变量中。
使用B
重写规则也可以,但是参数中的所有加号仍然是php中的加号。
我必须面对的现实世界的例子:
/group/Simon+%26+Garfunkel
使用B
,它会重写为
group.php?group=Simon+%26+Garfunkel
在php中你得到
$group="Simon+&+Garfunkel";
当你想要的时候
$group="Simon & Garfunkel"
使用B你需要
/group/Simon%20%26%20Garfunkel
工作正常。
没有B
你得到
group.php?group=Simon%20&%20Garfunkel
你最终得到了
$group="Simon ";
因为&
划分了查询字符串。
但如果你双重逃避
/group/Simon+%2526+Garfunkel
重写为
group.php?group=Simon%20%26%20Garfunkel
你最终得到了
$group="Simon & Garfunkel";
像预期的那样。
如果mod_rewrite
未将网址解析为&#34;清除网址&#34;,那么我们可以正常使用%26
。
答案 3 :(得分:0)
尝试将此规则置于您的上方:
RewriteRule ^([^&]*)&(.*) $1\%26$2 [N]
答案 4 :(得分:0)
此外,如果您想要在URL中使用&符号向浏览器发送重定向,您可以将[NE]标记添加到RewriteRule的末尾。
RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L]