Apache2 - URL 目录末尾缺少“/”时进行 301 重定向

Apache2 - URL 目录末尾缺少“/”时进行 301 重定向

当请求这样的 URL 时,我并没有真正注意到这个 Redirect(301),末尾没有斜杠 (“/”):http://server/directory

服务器将响应一个 301 Redirect Permanent 标头,其中带有一个定位到 的位置标头http://server/directory/

参见此实例:

用户请求:

GET /social HTTP/1.1
( http://192.168.1.111/social )

Apache 服务器响应:

HTTP/1.1 301 Moved Permanently
Location: http://192.168.1.111/social/

用户请求:

GET /social/ HTTP/1.1
( http://192.168.1.111/social/ )

Apache 服务器响应:

HTTP/1.1 200 OK

Apache 访问日志:

192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social HTTP/1.1" 301 558 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"
-
192.168.1.130 - - [05/Apr/2014:22:06:47 +0200] "GET /social/ HTTP/1.1" 200 942 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0"

/social/ 目录包含一个index.html文件。

Apache 软件:Apache/2.2.22 (Ubuntu)
目录选项:Options Indexes FollowSymLinks MultiViews

所以,我的问题是:为什么 apache 会这样做?如何防止重定向并index.html直接发送?客户端必须发送两个请求,这确实没有必要。也许有些客户端不允许重定向,如果没有结尾斜杠(“/”),将无法访问该站点。

我不想禁用重定向。我希望服务器直接发送响应而不进行任何重定向。即使在请求时/social

Apache 是否设计用于重定向这些请求?服务器可以直接发送数据而不进行重定向,对吗?我应该使用 来mod_rewrite阻止这种情况吗?还是使用其他配置?或者我应该让它像这样并在所有 html 链接末尾添加斜线并接受一些重定向?

你们有什么感想?

答案1

发送数据而不进行重定向会破坏相对链接。如果http://server/directory包含file,则其完整 URL 为。如果基本 URL 为,http://server/directory/file则指定为 的链接<a href="file">将指向,但如果基本 URL 仅为 ,则它将指向,这不是预期的结果。http://server/directory/filehttp://server/directory/http://server/directoryhttp://server/file

Apache 可以根据 URL 以两种不同的方式生成目录列表,而不是重定向。但是,如果目录中有文件,则此方法不起作用index.html。因此,Apache 使用的是在两种情况下都有效的方法。

这并不是什么新现象,十年前 Apache 的行为也是一样的。现在应该已经修复了无法处理重定向的客户端。但对于任何无法处理重定向的客户端,Apache 应该发送一个带有可跟踪链接的小型 html 文件。

答案2

mod_dir添加此重定向,您可以使用DirectorySlash Off指示。

但请注意,禁用尾部斜杠重定向可能会导致某些页面崩溃。如果返回的页面包含相对链接,则在页面未带尾部斜杠的情况下,这些 URL 的解析方式会有所不同。

相关内容