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

我使用Apache / 2.2.3(Linux / SUSE)进行基于Kerberos的身份validation。 当用户试图打开某个url时,浏览器询问他有关HTTP基本身份validation中的域名login和密码。 如果用户取消这样的请求3次Apache返回401 Authorization Required错误页面。 我目前的虚拟主机configuration是

  <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错误页面。 我在虚拟主机configuration中添加了这样的行:

  ErrorDocument 401 /pages/401 

它的工作原理,当用户无法授权Apacheredirect他到我的好网页。 但是,Apache不会像以前那样询问用户login名\密码。 我同时需要这个function和不错的错误页面!

是否有可能使其正常工作?

首先,当我使用

 ErrorDocument 401 /pages/401 

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

 ErrorDocument 401 /401.html 

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

您所描述的行为是客户端 ,与Apache本身无关。

这是实际发生的事情:

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

如果访问被授予,Apache响应200,如果访问不被授权,则返回到步骤2并继续。 它取决于用户代理(即您的浏览器)将尝试多less次。 您的浏览器显然停止在3次尝试。 之后,它保持结果caching,只显示你的错误页面。

浏览器经常caching这些types的操作的结果,所以这是正常的。 你再次尝试之前是否退出浏览器? 这应该清除caching的结果。

如果你想看到Apache的行为方式“原始”,请使用以下命令:

未经validation的请求:

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

authentication*请求:

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

您将在输出的顶部看到Apache如何响应已validation的请求和尚未validation的请求。 你应该总是看到一个401不认识和200authentication。 如果情况并非如此,那么要么没有正确configuration,要么有其他事情正在进行。


* curl可以通过传递 – --negotiate来完成--negotiate身份validation,但是我从来没有这样做过,也没有一个有效的testing环境来尝试。阅读curl(1)手册了解更多信息。