【发布时间】:2011-07-01 19:27:18
【问题描述】:
这主要是一个关于解释 HTTP 规范的最佳方式的哲学问题。没有目录索引的目录(例如 index.html)应该返回 404 还是 403? (403 是 Apache 中的默认值。)
例如,假设以下 URL 存在并且可以访问:
http://example.com/files/file_1/
http://example.com/files/file_2/
但是什么都没有:
http://example.com/files/
(假设我们使用 301 来强制所有 URL 的尾部斜杠。)
我认为应该考虑几件事:
- 默认情况下,Apache 在这种情况下返回 403。这对我很重要。他们考虑了这些东西,并决定使用 403。
- 根据 W3C,403 的意思是“服务器理解请求,但拒绝执行”。我认为这意味着如果 URL 有意义但仍被禁止,您应该返回 403。
- 如果客户端正确猜测 URL 映射到磁盘上的真实目录,403 可能会导致信息泄露。
-
http://example.com/files/不是资源,它在内部映射到目录的事实与状态代码无关。 - 如果您将 URL 方案解释为从客户端的角度定义一个目录结构,内部实现仍然无关紧要,但也许外观确实应该与状态码有一些关系。也许,即使您在内部创建了相同的 URL 结构而不使用目录,您仍然应该使用 403,因为它是关于客户端对目录结构的感知。
总的来说,您认为最好的方法是什么?我们是否应该说“资源就是资源,如果它不存在,那就是 404”?或者我们应该说,“如果它有斜线,它在客户端看起来就像一个目录,因此如果没有索引,它就是一个 403?”
如果你是 403 阵营,你认为即使内部实现不使用目录,你是否应该竭尽全力返回 403?例如,假设您有一个带有以下 URL 的动态 Web 应用程序:http://example.com/users/joe,该应用程序映射到为 Joe 生成个人资料页面的一些代码。假设你不写列出所有用户的东西,http://example.com/users/ 应该返回 403 吗? (在这种情况下,许多(如果不是全部)Web 框架都返回 404。)
【问题讨论】:
标签: apache http http-status-code-404 http-status-codes http-status-code-403