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

3

我一直在编辑我的.htaccess文件,以使导航体验更加方便。根据Apache Foundation提供的语法,?只允许一个字符或单词被写入一次或零次,但似乎情况并非如此。由于某种原因,它允许我重复任意数量的字符。以下是更详细的问题描述。

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

那行代码能完美地实现我的要求,但我想知道为什么它允许我输入 localhost/contact////////////////////////,而不只是像正常情况下输入 localhost/contact 或者localhost/contact/这样的格式。

localhost/contact//////////////////////// 应该会进入指定的 404 HTTP ERROR 页面。

这似乎是Apache的问题,因为我在Stackoverflow上发现了相同的问题https://stackoverflow.com/unanswered//////

3个回答

2
我相信这只是Apache(和许多其他系统)解释路径的方式(请参见下面的引用和链接),所以我不确定是否有答案。
此外,我尝试了一些.htaccess的东西,两个或更多连续的斜杠似乎被解释为单个斜杠。除非在Apache中有一个配置选项来禁用此功能(或者甚至在操作系统级别禁用此功能,这可能会破坏其他内容),否则我认为不会有答案。(如果有方法,我很乐意纠正!)

以两个连续斜杠开头的路径名可能会以实现定义的方式解释,尽管多于两个前导斜杠应视为单个斜杠。

来源:Pathname Resolution 来自这个Unix.StackExchange答案,其中包含许多更有趣的链接。

“如果有更好的方法,请指正!@anubhava 是我们的正则表达式专家,他对 Apache 重写规则的知识总是非常准确。他的解决方案非常有效,可以消除 URL 中多个斜杠的问题。” - Giacomo1968

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]

1

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

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

如果出于某种原因您想要去掉多个斜杠,请使用以下命令:
RewriteCond %{THE_REQUEST} \s/+(.*?)/+(/\S*) [NC]
RewriteRule ^ %1%2 [R=302,L,NE]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接