Apache2 – 301在URL中目录结尾缺less“/”时redirect

我没有真正注意到这个redirect(301)当请求这样一个url没有斜杠(“/”)在最后: http://server/directory

服务器将使用定位到http://server/directory/的位置标题与301redirect永久标头进行响应。

看到这个现场的例子:

用户请求:

 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 access.log:

 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这样做? 而如何防止redirect并直接发送出index.html ? 客户必须发送两个真正没有必要的请求。 也许有些客户端不允许redirect,不能没有结束的斜杠(“/”)去的网站。

我不想禁用redirect。 我不想让服务器直接发送响应而没有任何redirect。 即使请求/social

apache是​​否被devise为redirect这些请求? 服务器可以发送数据而不redirect,对吧? 我应该使用mod_rewrite来防止这种情况? 还是另一个configuration? 或者我应该让它像这样,并在所有的HTML链接的末尾添加斜线,并与一些redirect生活?

你们有什么感想?

发送没有redirect的数据会破坏相关链接。 如果http://server/directory包含file ,那么完整的URL将是http://server/directory/file 。 像<a href="file">指定的链接将指向http://server/directory/file如果基本URL是http://server/directory/ ,但是如果基本URL只是http://server/directory它将指向http://server/file ,而不是预期的结果。

Apache可以用两种不同的方式生成目录列表,具体取决于URL而不是redirect。 但是,如果目录中有一个index.html文件,那么这将不起作用。 所以相反,Apache正在使用这种方法,在这两种情况下都起作用。

这不是一个新的行为,十年前Apache的行为是一样的。 现在不能处理redirect的客户应该已经被修复了。 但是,对于任何不能处理redirect的客户端,Apache都应该发送一个带有可以跟随的链接的小文件。

mod_dir添加了这个redirect,你可以使用DirectorySlash Off指令来禁用它。

但是,请注意,禁用尾部斜杠redirect可能会导致一些页面中断。 如果返回的页面包含相对链接,那么如果页面服务没有结尾的斜杠,这些URL将以不同的方式parsing。