缺少目录索引时的 404 与 403

Posted

技术标签:

【中文标题】缺少目录索引时的 404 与 403【英文标题】:404 vs 403 when directory index is missing 【发布时间】: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。)

【问题讨论】:

【参考方案1】:

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

10.4.4 403 禁止

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

10.4.5 404 未找到

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

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

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

【讨论】:

你认为“没有目录”应该是指客户端对目录的感知(基于URL中的斜线),还是服务器硬盘上的内部目录结构? 我觉得应该体现逻辑结构。当客户端在看到/user/3416143 从单个用户返回数据后尝试访问/user 时,它也可能意味着“是的,我知道您可能想要列出所有用户,但我们不这样做”。 我对 403 的理解是基于权限的:那里有 is 东西,但是不允许这个用户看到它。其他用户可能能够看到它——也许只有创建它的用户才应该有访问权限(或某些访问权限,例如 DELETE)。【参考方案2】:

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

确实,对于 404,Google 网站管理员工具会显示引用者(允许您清理指向目录的错误链接),而对于 403,它不会显示它。

【讨论】:

以上是关于缺少目录索引时的 404 与 403的主要内容,如果未能解决你的问题,请参考以下文章

403forbidden404not found宝塔 nginx配置默认首页nginx demo

当您决定返回 403 时,始终返回 404

有没有办法强制 apache 返回 404 而不是 403?

JAVA编程403、404、503错误,都可能是由啥原因产生的?

Nginx报错403 forbidden (13: Permission denied)的解决办法

如何把nginx的启动用户改成目录的所属用户,重起一下就能解决