Это может быть больше вопрос PHP и SO, но поскольку он касается HTTP-кодов, я подумал, что сначала спрошу здесь.
Итак, я создаю очень простой бэкэнд аутентификации пользователя, который в основном проверяет (достаточно защищенные) токены сеанса, чтобы подтвердить, существует ли сеанс пользователя и является ли он действительным. Если все прошло успешно, страница загружается, если аутентификация не удается, они перенаправляются на страницу входа.
Я хотел использовать код состояния HTTP 401 вместо 302, чтобы он отражал на уровне браузера и в журналах сервера, что браузер пытался получить доступ к еще не авторизованной странице, но это не увенчалось успехом.
Следуя нескольким примерам, я попытался установить ErrorDocument
директива в .htaccess
файл, но не повезло (перенаправление 404 работает нормально). Я отправлял различные комбинации заголовков через скрипт, три из них казались наиболее многообещающими:
header('Location: http://mysite.org/login.php', 1, 401);
Браузер показывает ответ 401, но без перенаправления.
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
header('Location: http://mysite.org/login.php');
Браузер перенаправляет, но показывает перенаправление исходной страницы как 302.
header('WWW-Authenticate: Basic realm="My Realm"');
header($_SERVER["SERVER_PROTOCOL"]." 401 Unauthorized");
header('Status: 401 Unauthorized');
header('Location: http://mysite.org/login.php');
С последним пробовал с и без Location
заголовок, с и без Status
, но во всех комбинациях он запускает только диалоговое окно базовой проверки подлинности браузера.
Итак, существует ли правильный или рекомендуемый способ обработки несанкционированного перенаправления через Интернет (не в браузере по умолчанию)?
Я знаю, что могу просто пойти с обычным 302
, но я хочу знать, единственный ли это вариант (или единственный вариант, соответствующий стандартам), прежде чем я сдаюсь.
В соответствии с RFC 2616, раздел 10.4, 4XX
коды ответов указывают на ошибки, и браузер не указывает Location
заголовок в ответе. Кроме того, 401
используется код ответа строго для HTTP-аутентификации, и директивы в RFC 2617 должен следовать.
Я бы рекомендовал использовать 303
или 302
код ответа.