2012-01-02 64 views
4

这种重写规则为什么Apache删除多个斜线?

RewriteRule ^test/(.*)$ test.php?url=$1

在此URL

mysite.com/test//one///two////three///

是给了我这个结果

$1=url='one/two/three/'

我使用的EasyPHP如果它很重要,我喜欢知道为什么Apache在内部删除多个斜杠而没有重定向到更正的URL?以及如何禁用或添加重定向到此行为?

预先感谢

+0

虽然多个斜杠在由“RewriteRule”_pattern_匹配的URL路径中折叠,但您仍然可以通过在“RewriteCond”指令中使用“%{REQUEST_URI}”服务器变量来访问完整URL(以及其他斜线) 。看到这个问题:http://stackoverflow.com/questions/38561645/htaccess-rewrite-removes-trailing-slashes – DocRoot 2016-07-25 09:26:36

回答

8

看来多个斜杠是针对标准。正如this post指出,RFC 1630说:

PATH

的URI的其余部分遵循取决于 方式的格式结肠。该路径的解释取决于所使用的协议 。但是,当它包含斜线时,这些顶点意味着分层结构。

///并不意味着分层结构 - 您将拥有空文件夹名称。从那里我会猜测Apache的行为是有目的的。 (使用多个斜线也不是一个好主意,因为这会导致无效的URL)。

我会使用不同的字符来代替。

+0

谢谢。并且如果搜索引擎跟踪从另一个网站到我的多个斜杠链接,这种行为是否会造成重复的内容? – Drust 2012-01-02 10:38:47

+0

@Drust我希望Google修复这个链接,但我无法确定。但是如果Apache用301修复它,我认为谷歌应该了解 – 2012-01-02 13:49:07

+2

@Pekka,“Apache/2.4.6(CentOS)”不会提供301重定向(在这种情况下,谷歌会将所有的URL与/ //“到一个正确的URL)。相反,它看起来像Apache重写所请求的URI,所以如果请求是“GET/test /// HTTP/1.1”,那么'REQUEST_URI'将是'test /'。我认为这是不好的,因为我想要完整的请求URI到我的脚本,它将处理它...仍在寻找解决方案。 – 2015-08-05 21:03:37