这主要是关于解释HTTP规范的最佳方式的哲学问题。没有目录索引的目录(例如index.html)是应该返回404还是403? (403是Apache中的默认值。)
例如,假设存在以下URL并且可以访问:
http://example.com/files/file_1/
http://example.com/files/file_2/
但是没有任何内容:
http://example.com/files/
(假设我们使用301s强制所有网址使用斜杠。)
我认为应该考虑几件事情:
http://example.com/files/
不是资源,内部映射到目录的事实与状态代码无关。总而言之,您认为最好的方法是什么?我们应该只说“资源是一种资源,如果它不存在,它就是404?”或者我们应该说,“如果它有斜杠,它看起来像客户端的目录,因此如果没有索引它就是403?”
如果您在403阵营,即使内部实施不使用目录,您认为您是否应该尽力返回403s?例如,假设您有一个带有此URL的动态Web应用程序:http://example.com/users/joe
,它映射到为Joe生成配置文件页面的某些代码。假设您没有写出列出所有用户的内容,那么http://example.com/users/
应该返回403吗? (在这种情况下,许多(如果不是所有的)Web框架都返回404。)
答案 0 :(得分:8)
回答这个问题的第一步是参考RFC 2616: HTTP/1.1。特别是关于403 Forbidden和404 Not Found的部分。
- 10.4.4 403 Forbidden
服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。
- 10.4.5 404 Not Found
服务器未找到与Request-URI匹配的任何内容。没有说明该病症是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用且没有转发地址,则应该使用410(Gone)状态代码。当服务器不希望明确拒绝请求的原因,或者没有其他响应适用时,通常会使用此状态代码。
我对此的解释是404是更通用的错误代码,只是说“那里什么都没有”。 403说“那里什么都没有,不要再试了!”。
Apache可能在没有显式索引文件的目录上返回403的一个原因是自动索引(即列出其中的所有文件)被禁用(a.k.a“禁止”)。在这种情况下,说“列出此目录中的所有文件是被禁止的”比说“没有目录”更有意义。
答案 1 :(得分:2)
为什么选择404的另一个理由是:谷歌网站管理员工具。
事实上,对于404,Google网站管理员工具会显示引用(允许您清除指向该目录的错误链接),而对于403,则不会显示它。