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 не запрашивает логин \ пароль пользователя, как раньше. Я хочу эту функциональность и хорошую страницу ошибок одновременно!

Можно ли сделать так, чтобы все работало правильно?

2 ответа

Решение

Во-первых, когда я использовал

ErrorDocument 401 /pages/401

/pages/401 был динамический бэкэнд-сгенерированный контент. Когда я создал простой статический 401.html и установили

ErrorDocument 401 /401.html

Вся система начала работать правильно. Поэтому решение таково: не используйте динамические страницы для отображения ошибки 401, используйте статический html.

Поведение, которое вы описываете, относится к клиентской части и само по себе не имеет ничего общего с Apache.

Вот что на самом деле происходит:

  1. Браузер отправляет запрос
  2. Веб-сервер отвечает 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 для unauth и 200 для auth. Если это не так, то он либо не настроен правильно, либо происходит что-то еще.


*curl может сделать аутентификацию Kerberos, передав --negotiate но я никогда не делал этого и у меня нет действительной тестовой среды, чтобы попробовать. curl(1) Руководство для получения дополнительной информации.

Другие вопросы по тегам