Перенаправление с заголовком, но HTTP-код всегда 200

Итак, у меня есть страница, которая проверяет, вошел ли пользователь в систему, и если это не так, они перенаправляются на страницу ошибки с кодом 403. Это код, который я использую для перенаправления:

header('Location: /error.php', true, 403);

Но вместо перенаправления он устанавливает только код 403. И если я попробую:

header('HTTP/1.1 403 FORBIDDEN');
header('Location: /error.php');

Потом перенаправляет, но код 200 ... Я действительно потерялся здесь и не смог найти ничего, что работало бы.

ps: это моя страница error.php

<link rel = "stylesheet" href = "css/error.css">
<?php if (http_response_code() === 404) : ?>
<div class = "error">404</div>
<br /><br />
<span class = "info">File not found</span>
<img src = "http://images2.layoutsparks.com/1/160030/too-much-tv-static.gif" class = "static" />
<?php elseif (http_response_code() === 403) : ?>
<div class = "error">403</div>
<br /><br />
<span class = "info">Unauthorized access</span>
<img src = "http://images2.layoutsparks.com/1/160030/too-much-tv-static.gif" class = "static" />
<?php endif; ?>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 111
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Из документов:

From the docs: "The second special case is the "Location:" header. Not only does it send this header back to the browser, but it also returns a REDIRECT (302) status code to the browser unless the 201 or a 3xx status code has already been set.

http://php.net/manual/en/function.header.php

При этом вы можете добавить заголовок на свою страницу error.php.

header("HTTP/1.0 403 Forbidden");

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

edmassarani 22.11.2018 18:23

Затем создайте страницу с несколькими ошибками, например error403.phperror500.php и так далее. Эти страницы могут include код другой страницы внутри после установки заголовка.

Felippe Duarte 22.11.2018 18:24

Вы не можете перенаправить с помощью кода 403, браузеры не будут учитывать заголовок местоположения, если код состояния не входит в раздел 3xx.

Это находится в RFC 7231:

For 3xx (Redirection) responses, the Location value refers to the preferred target resource for automatically redirecting the request.

Ответ принят как подходящий

Не используйте перенаправление, а используйте повторное использование скрипта.

Перенаправление означает: «То, что вы ищете, можно найти в другом месте». Вы не хотите отправлять пользователя в другое место. Вы хотите сказать им, что им не разрешено видеть то место, куда они пытались попасть.

Вместо этого используйте require, чтобы включить php-скрипт, который должен отображать информацию об ошибке для пользователя без изменения URI.

if (detectedUserNotAllowed)
{
   header('HTTP/1.1 403 FORBIDDEN');
   require("error.php");
   exit();
}

Вы не перенаправляете - вы просто генерируете 403 (или любой другой подходящий код ошибки), а Apache отправляет правильный ErrorDocument.

https://httpd.apache.org/docs/2.4/mod/core.html#errordocument

EG -

ErrorDocument 403 /errors/forbidden.php?referrer=%{escape:%{HTTP_REFERER}}

в вашей конфигурации Apache vhost или в файле .htaccess.

Даже документы Apache отмечают, что один из комментариев отражал отправку кода состояния с последующим перенаправлением -

Note that when you specify an ErrorDocument that points to a remote URL (ie. anything with a method such as http in front of it), Apache HTTP Server will send a redirect to the client to tell it where to find the document, even if the document ends up being on the same server. This has several implications, the most important being that the client will not receive the original error status code, but instead will receive a redirect status code. This in turn can confuse web robots and other clients which try to determine if a URL is valid using the status code. In addition, if you use a remote URL in an ErrorDocument 401, the client will not know to prompt the user for a password since it will not receive the 401 status code. Therefore, if you use an ErrorDocument 401 directive, then it must refer to a local document.

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