.htaccess – 使用Errordocument 401会导致空白页面

我的.htaccess看起来像这样:

ErrorDocument 401 /error/401.html
AuthType Basic
AuthName "Password Protected Area"
AuthUserFile /var/www/vhosts/funatodev.de/httpdocs/wordpress/.htpasswd
AuthGroupFile /dev/null
Require valid-user

# BEGIN WordPress

# END WordPress

但是当包含第一行而不是登录窗口时,我只得到一个空白页面. (当然,文件/error/401.html存在)我尝试添加以下行:

SetEnvIf Request_URI "^/(error/401\.html|robots\.txt)$" allow_all
Order allow,deny
Allow from env=allow_all
Satisfy any 

但这会导致内部服务器错误.

最佳答案 如果无法查看配置文件中的所有内容,仍然可以清楚地看到您遇到的问题,因为您已抢先拒绝“所有”用户访问错误页面.

换句话说,您无法发回本身受基本授权保护的错误页面.服务器不知道如何正确处理这种递归情况,因此它不会.

确保明确覆盖并禁用包含自定义错误页面的目录的.htaccess请求的授权.

例如,如果您的错误文件目录是/ error /,则表明:

<Directory /error/>
  Order allow,deny
  Allow from all
</Directory>

@弗雷德 – GANT

为了回答你的问题,让我对401进程进行一些扩展.有助于理解HTTP不是有状态协议.换句话说,每个请求和每个响应都与后续请求和响应隔离(关于实际的HTTP协议 – 当然,您的浏览器和服务器都可以维护有关每个请求的有状态信息,并尝试关联一个系列彼此的请求).

>在服务器配置中,您在服务器上定义受保护的区域,并定义启用访问权限的凭据.
>当首次请求受保护区域内的任何对象时,服务器将响应401标头,WWW-Authenticate标头和授权质询以及可选内容.请求和响应过程已完成.
>浏览器接收完成的响应,解析服务器响应中发送的授权质询,并以人类可读的格式呈现给您.
>如果您选择取消授权过程,则浏览器会显示响应正文(如果有).
>如果您选择提供登录凭据,则浏览器会以服务器请求的任何格式对其进行编码,并开始新请求.
>当通过第二个请求请求受保护区域内的任何对象时,服务器验证或使提供的凭据无效,并返回请求的对象,或者返回与之前相同的401标头和内容.
>如果浏览器在您尝试提供凭据后收到相同的401标头/内容,则会再次请求您提供凭据,或者您将看到从服务器发送的带有401标头的响应正文.
>如果服务器验证提供的凭据并返回请求的对象,则浏览器将继续为每个请求发送相同的凭据,直到当前浏览器会话终止.我称之为浏览器的“后验证模式”.

最重要的是要注意,在您从浏览器中看到来自登录凭​​据的请求之前,会从服务器收到完整的响应.

而且,浏览器甚至意识到它需要向您提供登录凭据的唯一方法是,如果不仅有401响应头,而且还有WWW-Authenticate头和挑战.

如果您的401自定义错误文档导致您的浏览器显示错误页面而不是请求登录凭据,则必须是认证标头和质询,或者甚至401状态代码本身未配置为伴随401错误文档.

对我们来说听起来很疯狂,但对于服务器的非人类逻辑,即使没有发送任何授权质询,向所有未授权的请求发送错误文档仍然是完全合理的,并且向所有浏览器发送实际对象“后验证模式.”

您可以通过注释掉自定义401错误文件指令,然后使用浏览器登录,加载受保护的页面,然后重新启用自定义401错误文件指令,然后刷新受保护的内容来查明是否发生了这种情况.浏览器中已经处于“验证后模式”的页面.

我期望您的预授权浏览器将继续使用此请求发送其凭据,并且服务器将使用请求的受保护对象进行响应.

因此,所有授权请求都一如既往地正常工作,但只是401错误文档和/或标头不包含验证质询触发器,告诉您的浏览器它需要询问您的凭据.

点赞