当请求这样的 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/file
http://server/directory/
http://server/directory
http://server/file
Apache 可以根据 URL 以两种不同的方式生成目录列表,而不是重定向。但是,如果目录中有文件,则此方法不起作用index.html
。因此,Apache 使用的是在两种情况下都有效的方法。
这并不是什么新现象,十年前 Apache 的行为也是一样的。现在应该已经修复了无法处理重定向的客户端。但对于任何无法处理重定向的客户端,Apache 应该发送一个带有可跟踪链接的小型 html 文件。
答案2
mod_dir
添加此重定向,您可以使用DirectorySlash Off
指示。
但请注意,禁用尾部斜杠重定向可能会导致某些页面崩溃。如果返回的页面包含相对链接,则在页面未带尾部斜杠的情况下,这些 URL 的解析方式会有所不同。