Apache 目录索引丢失时为404 vs 403

Apache 目录索引丢失时为404 vs 403,apache,http,http-status-code-404,http-status-codes,http-status-code-403,Apache,Http,Http Status Code 404,Http Status Codes,Http Status Code 403,这主要是一个关于解释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强制所有URL的尾部斜杠。) 我认为应该考虑以下几点: 默认情况下

这主要是一个关于解释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强制所有URL的尾部斜杠。)

我认为应该考虑以下几点:

  • 默认情况下,Apache在此场景中返回403。这对我很重要。他们考虑过这些东西,决定使用403
  • 根据W3C,403的意思是“服务器理解了请求,但拒绝满足它。”我认为这意味着如果URL有意义但仍然被禁止,您应该返回403
  • 403如果客户端正确猜测URL映射到磁盘上的真实目录,则可能导致信息泄漏
  • 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。)

回答这个问题的第一步是参考。特别是关于和的章节

  • 10.4.4 403禁止
服务器理解该请求,但拒绝满足该请求。授权没有帮助,请求不应重复。如果请求方法不是HEAD,并且服务器希望公开请求未得到满足的原因,那么它应该在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)

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

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


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

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


事实上,对于404,Google Webmaster工具会显示referer(允许您清除指向目录的错误链接),而对于403,它不会显示referer。

您认为“没有目录”是指客户对目录的感知(基于URL中的斜线),或者服务器硬盘上的内部目录结构?我认为它应该反映逻辑结构。当客户端在看到
/user/3416143
返回单个用户的数据后试图访问
/user
时,这也可能意味着“是的,我知道您可能想列出所有用户,但我们不这样做”。我对403的理解是基于权限的:有一些内容,但不允许该用户查看。另一个用户可能可以看到它——可能只有创建它的用户才应该有访问权(或某些访问权,例如DELETE)。