#php #header
Если кратко то есть функция 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
Ответы
Ответ 1
Есть такое подозрение, что заголовок location работает только с трёхсотой группой кодов. Вроде 404 надо отдавать прям страницей ошибки, а не пытаться туда упихать редирект. В принципе можно попробовать Refresh: 3; URL=http://site.ru/404 Но вообще, это плохая идея, портить адрес страницы. Вот перепечатывал пользователь какой-то url, опечатался в одной букве и теперь ему всё вводить заново? Вместо того, чтобы просто исправить?Ответ 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 - у браузера нет никаких причин для перехода.Ответ 3
Что-то подобное видел. Дело было в exit(), он по разному ведет себя на разных серверах. Возможно дело в php или в настройках. Может попробовать в конце return ? Это правильней.
Комментариев нет:
Отправить комментарий