为了避免引起混淆,我并不是在寻求有关调试 Web 服务器的技术问题的帮助。我询问的是 Apache(和其他 Web 服务器)在对某个文件或其父目录没有权限时抛出 403 的错误背后的历史和逻辑。
例如,假设我的 DocumentRoot 中有一个这样的文件:
-rw-r----- 1 nobody staff 0 Apr 12 09:35 file.html
Apache 在不属于 staff 组的用户 www 下运行。如果我尝试打开此文件的 URL,则会收到 HTTP 403 Forbidden。
服务器理解了请求,但拒绝执行。授权不会有帮助,并且不应重复该请求。
我理解 Apache 无法提供文件的技术原因。但为什么要使用 403?500 系列错误之一(或 404)不是更准确吗?
我的理由是,服务器无法提供文件,因为文件系统权限不正确(配置错误),或者管理员故意希望文件位于文档树中但无法在网络上访问(想一想...错误消息通常是“你无权访问此服务器上的 /file.html。“... 那么谁有权限?Apache 是否配置为根据谁登录到 Web 界面来切换操作系统用户?)。
如果文件位于文档树之外(例如,/etc/passwd),那么我预计服务器会给出 404。
编辑:写作/语法
答案1
由于历史原因,只需查看旧的 HTTP 1.0 规范即可RFC 1945(重点是我的):
#403 禁忌
服务器理解了请求,但拒绝执行。
授权不会有帮助,不应重复请求。
如果请求方法不是 HEAD,并且服务器希望公开请求未执行的原因,则应在实体主体中描述拒绝的原因。
当服务器不希望透露拒绝请求的具体原因,或者没有其他适用的响应时,通常使用此状态代码。
因此,403 错误只是一种惯例,它提供了不会泄露不必要信息的错误消息。
在更近的RFC 7231403 错误变成了更通用的“未经授权”,即用户没有使用该资源所需的权限:
... 如果请求中提供了身份验证凭据,则服务器认为它们不足以授予访问权限。客户端不应使用相同的凭据自动重复请求。客户端可以使用新的或不同的凭据重复请求。但是,请求可能会因与凭据无关的原因而被禁止。