mod_rewrite用%26替换所有&符号的实例以供日后使用

时间:2009-08-23 07:19:11

标签: php mod-rewrite urlencode ampersand

我想在我的网址中不使用&符号,这样我就可以在请求文件时将&符号进一步传入我的系统。问题是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>`

5 个答案:

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