使用Errordocument 401会导致空白页面

时间:2014-06-18 10:19:55

标签: .htaccess .htpasswd errordocument

我的.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 

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

1 个答案:

答案 0 :(得分:2)

如果无法查看配置文件中的所有内容,仍然可以清楚地看到您遇到的问题,因为您已经先发制人地拒绝了所有问题"所有"用户访问错误页面。

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

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

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

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

@佛瑞德-甘特

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

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

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

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

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

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

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

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

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