Apache:mod_rewrite:URL中的Spcaes和特殊字符不起作用

Moo*_*oon 1 apache mod-rewrite urlencode special-characters

我正在使用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
Run Code Online (Sandbox Code Playgroud)

现在这些正在传递的变量 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
Run Code Online (Sandbox Code Playgroud)

它让我定义规则,但当我点击我的链接时,我得到 404未找到错误"在此服务器上找不到请求的URL/wallz/Characters&Supers.html."

问题:做什么?

我的猜测是我不应该在.htaccess里面做HTML URL编码

Tim*_*one 5

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

由于空格在此处用作分隔符,因此您还需要转义空格:

RewriteRule ^Characters\ &\ Supers\.html$ papers.php?f=%0&of=0&s=Newest
Run Code Online (Sandbox Code Playgroud)

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

RewriteRule "^Characters & Supers\.html$" papers.php?f=%0&of=0&s=Newest
Run Code Online (Sandbox Code Playgroud)

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