【问题标题】:Using Errordocument 401 leads to blank page使用 Errordocument 401 导致空白页
【发布时间】:2014-06-18 10:19:54
【问题描述】:

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

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

【问题讨论】:

  • ErrorDocument 401 /error/401.html 被注释掉时,你会得到登录窗口吗?
  • 是的,然后我得到一个登录窗口。
  • /error/401.html 是 wordpress 页面吗?
  • 不,只是我创建的一个 html。
  • 我确定您已经检查了文件权限,但以防万一:确保 Web 服务器的用户可以读取该 401.html 文件并可以执行其目录(以及每个父级,所有直到/)。

标签: .htaccess .htpasswd errordocument


【解决方案1】:

由于无法查看配置文件中的所有内容,但由于您预先拒绝“所有”用户访问错误页面,您所遇到的问题仍然很明显。

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

确保为包含您的自定义错误页面的目录明确覆盖并禁用 .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 错误文档和/或标题不包含身份验证质询触发器,它告诉您的浏览器它需要询问您为您的凭据。

【讨论】:

  • 好点,但假设错误文档不在安全目录中,还有什么其他原因?
  • 任何想法如何解决导致错误文档的次要问题无法正确解决的主要问题,即明显无法提供自定义 401 页面和安全目录/文件的登录对话框?
  • 首先 - 感谢您发布详尽的回复,尽管有几点我不确定是否完全正确。此外,在您添加大部分答案之前,赏金到期后的宽限期已经结束,所以没有骰子:-( 其次 - 事实证明我的错误文档实际上是导致我个人遇到的问题,我目前正在重建它可以解决这个问题,并会在我有时间时将我的发现作为答案发布在这里(然后会扩大我的争论)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 2013-12-20
相关资源
最近更新 更多