Apache:如何设置自定义 401 错误页面并保存原始行为

Apache:如何设置自定义 401 错误页面并保存原始行为

我有基于 Kerberos 的 Apache/2.2.3 (Linux/SUSE) 身份验证。当用户尝试打开某个 URL 时,浏览器会像 HTTP Basic Auth 一样询问用户域登录名和密码。如果用户取消此类请求 3 次,Apache 将返回401 Authorization Required错误页面。我当前的虚拟主机配置是

    <Directory /home/user/www/current/public/>
            Options -MultiViews +FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
            AuthType Kerberos
            AuthName "Domain login"
            KrbAuthRealms DOMAIN.COM
            KrbMethodK5Passwd On
            Krb5KeyTab /etc/httpd/httpd.keytab
            require valid-user
    </Directory>

我想设置一个漂亮的自定义 401 错误页面,其中包含一些用户说明。我在虚拟主机配置中添加了以下行:

 ErrorDocument 401 /pages/401

它有效,当用户无法授权时,Apache 会将他重定向到我的漂亮页面。但 Apache 不会像以前一样询问用户登录名\密码。我想要同时使用此功能和漂亮的错误页面!

是否可以让它正常工作?

答案1

首先,当我使用

ErrorDocument 401 /pages/401

/pages/401是动态后端生成的内容。当我创建了简单的静态内容401.html并设置了

ErrorDocument 401 /401.html

整个系统开始正常工作。所以解决方案是:不要使用动态页面来显示 401 错误,使用静态 html。

答案2

你所描述的行为是客户端并且本质上与 Apache 无关。

以下是实际发生的情况:

  1. 浏览器发送请求
  2. Web 服务器响应 401
  3. 浏览器提示用户输入凭证
  4. 浏览器使用凭证重新发送请求

如果授予访问权限,Apache 将响应 200,如果未授予访问权限,则返回步骤 2 并继续。尝试的次数取决于用户代理(即您的浏览器)。您的浏览器显然会在尝试 3 次后停止。此后,它会将结果缓存起来,只向您显示错误页面。

浏览器通常会缓存此类操作的结果,因此这是正常的。您在重试之前退出了浏览器吗?这应该会清除缓存的结果。

如果您想要确切了解 Apache 的“原始”行为方式,请使用以下命令:

未经身份验证的请求:

curl -D - http://yourserver/page.html

已验证*的请求:

curl -u user:pass -D - http://yourserver/page.html

您将在输出的最顶部看到标头,其中显示了 Apache 如何响应经过身份验证的请求和未经身份验证的请求。对于未经身份验证的请求,您应该始终看到 401,而对于经过身份验证的请求,您应该始终看到 200。如果不是这种情况,则说明配置不正确或发生了其他问题。


*curl可以通过传递进行 kerberos 身份验证--negotiate,但我从未这样做过,也没有有效的测试环境可以尝试。阅读curl(1)手册以获取更多信息。

相关内容