.htaccess Mod Rewrite不允许额外的字符

时间:2014-06-28 20:45:50

标签: regex apache .htaccess http mod-rewrite

我一直致力于我的.htaccess文件,使导航体验变得更加轻松。根据Apache Foundation ?提供的语法,只允许一次或零次写入一个字符或单词,但这似乎并非如此。由于某种原因,它允许我复制我想要的多个字符。以下是更详细的问题。

RewriteRule ^contact([/]?)$  contact.php

这条线路完美适用于我想要的东西,但我想知道为什么它允许我这样做localhost/contact////////////////////////而不仅仅是localhost/contactlocalhost/contact/应该。

localhost/contact////////////////////////应该转到指定的404 HTTP ERROR页面。

这似乎是Apache的问题,因为我已经意识到stackoverflow包含同样的问题https://stackoverflow.com/unanswered//////

3 个答案:

答案 0 :(得分:2)

我相信这只是Apache(以及许多其他系统)解释路径的方式(参见下面的引用和链接),所以我不确定是否有答案。

此外,我尝试使用.htaccess进行了一些操作,并且2个或更多连续斜线似乎被解释为单斜杠。除非在Apache中有一个配置选项来禁用它(或者甚至可能在操作系统级别禁用此功能,这可能反过来打破其他事情),我不认为会有答案。 (如果有办法的话,很高兴得到纠正!)

  

以两个连续斜杠开头的路径名可能是   以实现定义的方式解释,但不仅仅是   两个前导斜杠应视为单斜杠。

来源:Pathname Resolution来自this Unix.StackExchange answer,其中包含更多有趣的链接

答案 1 :(得分:1)

您需要在RewriteEngine On行下面添加此规则,以便将所有带有多个斜杠的网址发送到404处理程序:

RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S+) [NC]
RewriteRule ^ [L,R=404]

如果出于某种原因你想要剥离多个斜线,请使用:

RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S*) [NC]
RewriteRule ^ %1%2 [R=302,L,NE]

答案 2 :(得分:1)

我实际上今天或者昨天早些时候发布了一个答案? - 我试图解决这个问题,但是在我发布经过测试和运行的修改后的规则集之前你删除了它。所以这里是供参考:

RewriteEngine On
RewriteRule ^contact(/.*)?$  contact.php [L,NE]

此重写规则确保仅重写localhost/contact/localhost/contact。但localhost/contactdasopidsai9asd9i之类的内容只是发送了404

但在这个问题中,你提出了localhost/contact////////////////////////的案例。 anubhava已正确回答了此案;他的重写规则逻辑可以将多个斜杠发送到404。因此,如果你将我拥有的东西与他拥有的东西结合起来,我认为你将有一个很好的解决方案来解决你的问题:

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S+) [NC]
RewriteRule ^ [L,R=404]
RewriteRule ^contact(/.*)?$  contact.php [L,NE]