header('Location:') не перенаправляет

257
06 марта 2017, 13:14

Если кратко то есть функция

static function ErrorPage404()
{
    $host = 'http://'.$_SERVER['HTTP_HOST'].'/404';
    header('HTTP/1.1 404 Not Found');
    header("Status: 404 Not Found");
    header('Location:'.$host.'');
    exit();
}

В нужный момент ее вызываю и на локальном хостинге все работает... Но при переносе срабатывают все заголовки, кроме location ... Подозреваю что дело в настройке сервера (возможно из за SSL, включен 301 редирект с http на https) но не могу докопаться...

Читал подобные проблемы, но решения так и не нашел... Вот что пробовал: Установил значение output_buffering = On,ob_start(),ob_end_flush();

Вот что выдает браузер(название сайта заменил):

Request URL:https://site.ru/avtolombard/asd
Request Method:GET
Status Code:404 Not Found
Response Headers
view source
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:14247
Content-Type:text/html; charset=UTF-8
Date:Sat, 04 Mar 2017 19:36:07 GMT
Keep-Alive:timeout=3, max=100
Location:http://site.ru/404
Server:Apache
Vary:Accept-Encoding,User-Agent

В действительности оказалось, что не работает Location с заголовком 404... Спасибо @Qwertiy за совет по поводу неудобства для пользователя. По итогу добавил пару условий в маршрутизатор и выдаю контент 404-й станицы с заголовками 404, не меняя URL

Answer 1

Есть такое подозрение, что заголовок location работает только с трёхсотой группой кодов. Вроде 404 надо отдавать прям страницей ошибки, а не пытаться туда упихать редирект.

В принципе можно попробовать

Refresh: 3; URL=http://site.ru/404

Но вообще, это плохая идея, портить адрес страницы. Вот перепечатывал пользователь какой-то url, опечатался в одной букве и теперь ему всё вводить заново? Вместо того, чтобы просто исправить?

Answer 2

404 следует отдавать без редиректа, через readfile или include, например.

static function ErrorPage404()
{
    header('HTTP/1.1 404 Not Found');
    header("Status: 404 Not Found");
    include('path/to/404.php');
    exit();
}

Наличие редиректа в любом случае предполагает 3xx статус.
Если же вебсервер пропускает 404 совместно с Location - у браузера нет никаких причин для перехода.

Answer 3

Что-то подобное видел. Дело было в exit(), он по разному ведет себя на разных серверах. Возможно дело в php или в настройках.

Может попробовать в конце return ? Это правильней.

READ ALSO
Как правильно сделать условие и запрос к БД?

Как правильно сделать условие и запрос к БД?

Подскажите, пожалуйста, как сделать, чтобы правильно заносились данные, а то 5 раз повторяетсяНужно, чтобы при пополнении от определенной...

232
Как работает запись if($var){ … } или if(!$var){ … }?

Как работает запись if($var){ … } или if(!$var){ … }?

Друзья всем привет!!! помогите разобраться раз и навсегда с этой записью, до сих пор сильно путаюсь, благодарю вас заранее

284
$_POST зависит от чекбокса

$_POST зависит от чекбокса

Доброго времени суток, из select выбирается значение, switch определяет какое действие выполнятьВ форме вместе с select есть чекбокс

242