Назад | Перейти на главную страницу

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

Можно ли заставить его работать нормально?

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

ErrorDocument 401 /pages/401

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

ErrorDocument 401 /401.html

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

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

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

  1. Браузер отправляет запрос
  2. Веб-сервер отвечает 401
  3. Браузер запрашивает у пользователя учетные данные
  4. Браузер повторно отправляет запрос с учетными данными

Если доступ предоставлен, 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) руководство для получения дополнительной информации.