Базовая аутентификация с PHP дает бесконечный цикл

По какой-то причине я не могу заставить базовую аутентификацию работать с использованием PHP на моем сервере. Я использую точный код со страницы руководства:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

Однако, когда я запускаю его, я никогда не могу выйти за пределы подсказки.

Если я поставлю этот же код на другой сервер, он будет работать нормально.

Кто-нибудь знает, что может быть причиной этого? Оба сервера являются стеками WAMP, и в Apache включен модуль auth_basic_module. Файлы PHP.ini также практически идентичны.

Я взглянул на заголовки, и после того, как я ввел свое имя пользователя/пароль, был отправлен заголовок «Авторизация: Basic XXXXXX».


person Brandon0    schedule 08.02.2011    source источник
comment
попробуйте diff на двух файлах php.ini на всякий случай, если вы что-то упустили. Вы также можете сравнить конфигурации Apache.   -  person ocodo    schedule 08.02.2011
comment
Ссылка: http://www.php.net/manual/en/features.http-auth.php   -  person Pekka    schedule 08.02.2011


Ответы (1)


Это зависит от используемого интерфейса PHP. Переменная среды PHP_AUTH_USER используется только для mod_php и если Apache помог.

Если вы инициализируете авторизацию из скрипта, то вам придется искать заголовок HTTP_AUTHORIZATION, и расшифровывать и дробить его самостоятельно. Посмотрите на этот комментарий: http://www.php.net/manual/en/features.http-auth.php#94349

Для настроек FastCGI или вызовов suexec у вас может даже отсутствовать этот заголовок в переменных среды. Он отфильтрован из соображений безопасности. Распространенный обходной путь — переписать заголовок с помощью правила .htaccess:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Таким образом, он становится доступным в смешанном регистре как $_SERVER["HTTP_Authorization"].

person mario    schedule 08.02.2011
comment
Я отмечаю ваш ответ как ответ, потому что он был чрезвычайно полезен. Я не знаю почему (возможно, знаете), но переменная окружения HTTP_AUTHORIZATION была переименована в REDIRECT_HTTP_AUTHORIZATION. Я могу проверить это, переименовать его в HTTP_AUTHORIZATION, а затем продолжить работу с кодом, как указано в опубликованном вами комментарии к руководству по php. - person Brandon0; 08.02.2011
comment
@ Brandon0: префикс REDIRECT_ - еще одна особенность варианта PHP FastCGI. Но я так и не узнал, при каких обстоятельствах это происходит и какие настройки конфигурации вызывают это. - person mario; 08.02.2011
comment
@ Brandon0 У меня та же проблема, но я не мог понять, какое исправление вы применили для ее решения. Можете ли вы поделиться изменениями, которые вы сделали в коде? - person DMEM; 12.06.2016
comment
@mario: то же самое для тебя. Какие изменения в коде нужно внести, чтобы решить эту проблему? - person DMEM; 13.06.2016
comment
@DMEM Как сказал OP, вместо этого он искал заголовок REDIRECT_HTTP_AUTHORIZATION. - person mario; 13.06.2016
comment
@mario: Спасибо за ответ. Что в конечном итоге решило это для меня, так это ваше решение с добавлением правила в файл .htaccess. Спасибо. - person DMEM; 13.06.2016