这主要是一个关于解释 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。)