У меня есть аутентификация на основе 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 не запрашивает логин \ пароль пользователя, как раньше. Я хочу одновременно эту функциональность и красивую страницу ошибок!
Можно ли заставить его работать нормально?
Во-первых, когда я использовал
ErrorDocument 401 /pages/401
/pages/401
был динамическим контентом, генерируемым сервером. Когда я создал простой статический 401.html
и установили
ErrorDocument 401 /401.html
вся система заработала нормально. Итак, решение: не используйте динамические страницы для отображения ошибки 401, используйте статический html.
Вы описываете поведение сторона клиента и сам по себе не имеет ничего общего с Apache.
Вот что происходит на самом деле:
Если доступ предоставлен, Apache отвечает 200, если доступ не предоставлен, он возвращается к шагу 2 и продолжает. Это зависит от User-Agent (то есть вашего браузера), сколько раз он будет пытаться. Ваш браузер, по-видимому, останавливается на 3 попытках. После этого он сохраняет результат в кеше и просто показывает страницу с ошибкой.
Браузеры часто кэшируют результаты таких операций, так что это нормально. Вы закрыли браузер перед повторной попыткой? Это должно очистить кешированный результат.
Если вы хотите точно увидеть, как Apache ведет себя «в чистом виде», используйте следующее:
Неаутентифицированный запрос:
curl -D - http://yourserver/page.html
Аутентифицированный * запрос:
curl -u user:pass -D - http://yourserver/page.html
В самом верху вывода вы увидите заголовки, показывающие, как Apache отвечает на аутентифицированные и не аутентифицированные запросы. Вы всегда должны видеть 401 для unauth и 200 для auth. Если это не так, то либо он настроен неправильно, либо происходит что-то еще.
*curl
может выполнять аутентификацию Kerberos, передавая --negotiate
но я никогда этого не делал, и у меня нет подходящей тестовой среды, чтобы попробовать. Прочтите curl(1)
руководство для получения дополнительной информации.