Итак, у меня есть страница, которая проверяет, вошел ли пользователь в систему, и если это не так, они перенаправляются на страницу ошибки с кодом 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; ?>






Из документов:
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");
Затем создайте страницу с несколькими ошибками, например error403.phperror500.php и так далее. Эти страницы могут include код другой страницы внутри после установки заголовка.
Вы не можете перенаправить с помощью кода 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.
да, могу, но я забыл сказать в вопросе, что я использую эту страницу ошибки для нескольких кодов ошибок. Поэтому я хотел установить его до того, как он попадет на страницу, чтобы он отображал правильный код ошибки