Apache:mod_rewrite:Spaces和; URL中的特殊字符无效

时间:2010-11-18 14:15:37

标签: apache mod-rewrite special-characters urlencode

我正在使用APACHE:mod_rewrite来定义一组用于重写URLS的规则

我希望此链接显示为

/myDIR/walls.php?f=All&of=0&s=Newest - > All.html

所以我使用以下规则

来自(.htaccess)的

文字

RewriteEngine  on
RewriteBase    /myDIR/   
RewriteRule ^All\.html$  papers.php?f=All&of=0&s=Newest

现在这些变量被传递为 f=All of=0 s=Newest这些用于查询,显然和其中一个变量,即f有时会包含空格和特殊字符的值,我不能避免这种情况,因为数据库已经就位,所有我正在重写URL ....

现在我尝试定义像这样的规则

我希望此链接显示为

/myDIR/walls.php?f=Characters & Supers&of=0&s=Newest - > Characters & Supers.html

这是错的我知道因为不应该有任何空格..所以为了正确我定义这样的规则

RewriteRule ^Characters%20%26%20Supers\.html$  papers.php?f=Characters%20%26%20Supers&of=0&s=Newest

它让我定义规则,但当我点击我的链接时,我得到了这个 404 Not Found Error“在此服务器上找不到请求的URL / wallz / Characters& Supers.html。”

问题:该怎么做?

我的猜测是我不应该在.htaccess

中进行HTML URL编码

1 个答案:

答案 0 :(得分:5)

你的猜测是正确的。当URL到达mod_rewrite进行处理时,Apache已经为您解码了URL。因此,如果要检查任何其他编码的字符,则需要使用它们的文字表示。

由于在这里将空格用作分隔符,您还需要转义空格:

RewriteRule ^Characters\ &\ Supers\.html$ papers.php?f=%0&of=0&s=Newest

我相信使用引号也会起作用,所以以下内容应该是等效的(尽管它未经测试):

RewriteRule "^Characters & Supers\.html$" papers.php?f=%0&of=0&s=Newest

关于Apache解码过程的最后一点是它会自动为你删除多个斜杠。虽然与您的示例无关,但它是在达到您的mod_rewrite规则之前如何转换URL的另一个示例。