9

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

4

2 回答 2

8

回答这个问题的第一步是参考RFC 2616:HTTP/1.1。特别是讨论403 Forbidden404 Not Found的部分。

  • 10.4.4 403 禁止

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码 404(未找到)来代替。

  • 10.4.5 404 未找到

服务器未找到任何与请求 URI 匹配的内容。没有说明这种情况是暂时的还是永久性的。如果服务器通过一些内部可配置的机制知道旧资源永久不可用并且没有转发地址,则应该使用 410 (Gone) 状态代码。当服务器不希望确切地揭示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。

我对此的解释是 404 是更一般的错误代码,它只是说“那里什么都没有”。403 说“那里什么都没有,不要再试了!”。

Apache 可能在没有明确索引文件的目录上返回 403 的原因之一是自动索引(即列出其中的所有文件)被禁用(也称为“禁止”)。在这种情况下,说“禁止列出此目录中的所有文件”比说“没有目录”更有意义。

于 2011-02-22T08:22:14.563 回答
2

另一个为什么 404 更可取的论点:谷歌网站管理员工具。

实际上,对于 404,Google Webmaster Tool 会显示引用者(允许您清理到目录的错误链接),而对于 403,它不会显示它。

于 2012-02-18T23:40:26.627 回答