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

Коды состояния HTTP для логики веб-приложений

Это может быть больше вопрос 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 код ответа.