我有基于 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 无关。
以下是实际发生的情况:
- 浏览器发送请求
- Web 服务器响应 401
- 浏览器提示用户输入凭证
- 浏览器使用凭证重新发送请求
如果授予访问权限,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)
手册以获取更多信息。