0

我只想在我的 URL 中不使用 & 号,以便在请求文件时可以将 & 号进一步向下传递到我的系统中。问题是 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>`
4

5 回答 5

4

首先确保您正在构建的 url 已将 & 符号转义为 %26,因此当它到达您的服务器时它不是 & 符号。然后在您的重写规则中添加 B 标记,这样它就不会将其转换回 &:

RewriteRule ^(.*)$ index.php?url=$1 [B,QSA,L]

在尝试不同的重写规则 2 天后,这个 B 标签拯救了我的屁股。

于 2012-09-07T00:04:05.090 回答
1

添加

RewriteRule ^(.*)\&(.*)$ $1\%26$2

到你的重写规则。

于 2009-08-23T07:51:33.647 回答
1

在修改的查询字符串中转义&符号的正确方法mod_rewrite

%2526

如果它正在由 php 处理。

当apache重写它时,它会从php转换成%2526并存储在查询变量中。%26&

使用B重写规则也可以,但是参数中的所有加号仍然是 php.ini 中的加号。

我不得不面对的现实世界的例子:

/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";

像预期的那样。

如果 url 没有被解析mod_rewrite成“干净的 url”,那么我们可以使用%26就好了。

于 2017-08-26T18:40:31.130 回答
0

尝试将此规则置于您的之上:

RewriteRule ^([^&]*)&(.*) $1\%26$2 [N]
于 2009-08-23T08:29:04.540 回答
0

此外,如果您想向浏览器发送回 URL 中带有 & 符号的重定向,您可以将 [NE] 标志添加到 RewriteRule 的末尾。

RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L]
于 2010-05-22T20:40:14.180 回答