在无法查看配置文件中的所有内容的情况下,您所遇到的问题仍然很明显,因为您先发制人地拒绝了“所有”用户访问错误页面。
换句话说,您不能发回本身受基本授权保护的错误页面。服务器不知道如何正确处理这种递归情况,所以它不知道。
确保明确覆盖并禁用.htaccess
包含自定义错误页面的目录的 -requested 授权。
例如,如果您的错误文件目录/error/
如您所指示:
<Directory /error/>
Order allow,deny
Allow from all
</Directory>
@弗雷德甘特
为了回答你的问题,让我稍微扩展一下 401 流程。它有助于理解 HTTP 不是有状态协议。换句话说,每个请求和每个响应都与后续的请求和响应隔离存在(相对于实际的 HTTP 协议——当然,您的浏览器和服务器都可以维护有关每个请求的状态信息,并尝试关联一系列彼此的请求)。
- 在您的服务器配置中,您在服务器上定义一个受保护的区域,并定义启用访问的凭据。
- 当第一次请求受保护区域内的任何对象时,服务器会以 401 标头、
WWW-Authenticate
标头和授权质询以及可选内容进行响应。请求和响应过程已完成。
- 浏览器接收完成的响应,解析服务器响应中发送的授权质询,并以人类可读的格式呈现给您。
- 如果您选择取消授权过程,则浏览器会向您显示响应正文(如果有)。
- 如果您选择提供您的登录凭据,浏览器会以服务器请求的任何格式对它们进行编码,并开始一个新的请求。
- 当通过第二个请求请求保护区域内的任何对象时,服务器将验证或使提供的凭据无效,并返回请求的对象,或者返回与以前相同的 401 标头和内容。
- 如果在您尝试提供凭据后浏览器收到相同的 401 标头/内容,那么您将再次被要求提供凭据,或者您会看到从服务器发送的带有 401 标头的响应正文。
- 如果服务器验证了提供的凭据并返回了请求的对象,那么您的浏览器将继续为每个请求发送相同的凭据,直到当前浏览器会话终止。让我将其称为浏览器的“身份验证后模式”。
需要注意的最重要的事情是,在您从浏览器中看到来自登录凭据的请求之前,就会从服务器收到完整的响应。
您的浏览器甚至意识到它需要向您提供登录凭据请求的唯一方法是,如果不仅有 401 响应标头,而且还有WWW-Authenticate
标头和挑战。
如果您的 401 自定义错误文档导致您的浏览器显示错误页面而不是请求登录凭据,那么肯定是身份验证标头和质询,甚至可能是 401 状态代码本身,未配置为伴随 401 错误文档。
对我们来说这听起来很疯狂,但对于服务器的非人类逻辑来说,即使没有发送授权挑战,向所有非授权请求发送错误文档以及向所有浏览器发送实际对象仍然是完全合理的。 “后认证模式。”
您可以通过注释掉自定义 401 错误文件指令,然后使用浏览器登录,加载受保护页面,然后重新启用自定义 401 错误文件指令,然后刷新受保护浏览器中已经处于“身份验证后模式”的页面。
我期望您的预授权浏览器将继续使用此请求发送其凭据,并且服务器将响应请求的受保护对象。
因此,所有授权请求都像往常一样正常工作,但只是 401 错误文档和/或标头不包含身份验证质询触发器,它告诉您的浏览器它需要询问您的凭据。