我使用 Apache/2.2.3 (Linux/SUSE) 进行基于 Kerberos 的身份验证。当用户试图打开一些 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 不像以前那样询问用户登录\密码。我同时想要这个功能和漂亮的错误页面!
是否有可能使其正常工作?
首先,当我使用
/pages/401
是动态后端生成的内容。当我创建了简单的静态401.html
并设置了整个系统开始正常工作。所以解决方案是:不要使用动态页面来显示 401 错误,使用静态 html。
您所描述的行为是客户端的,与 Apache 本身无关。
这是实际发生的事情:
如果授予访问权限,Apache 将返回 200,如果未授予访问权限,则返回步骤 2 并继续。由用户代理(即您的浏览器)决定尝试多少次。您的浏览器显然在尝试 3 次后停止。之后它会缓存结果并只显示错误页面。
浏览器经常缓存这些类型操作的结果,所以这是正常的。在重试之前您是否退出了浏览器?那应该清除缓存的结果。
如果您想准确查看 Apache 的“原始”行为方式,请使用以下命令:
未经身份验证的请求:
已验证*请求:
您将在输出的最顶部看到标头,了解 Apache 如何响应经过身份验证的请求和未经身份验证的请求。您应该始终看到 401 代表未授权,200 代表授权。如果不是这种情况,那么它要么配置不正确,要么发生了其他事情。
*
curl
可以通过传递进行 kerberos 身份验证,--negotiate
但我从未这样做过,也没有有效的测试环境可以尝试。阅读curl(1)
手册以获取更多信息。