我没有真正注意到这个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。