Всем доброго времени суток Задача стоит такая: На сайте настроена отдача 404й ошибки без изменения урла, нужно сделать 301 редирект на статическую страницу 404.html которая будет отдавать 404 статус.
Проблема в том, что при добавлении в 404.php функции LocalRedirect ("/404.html", "404 Not Found" осуществляется 302 редирект, а 404.html возвращает ответ "200 ОК" добавление в .htaccess правила
Код
"ErrorDocument 404 /404.html"
не помогает.. Читал статьи по это теме, в частности эту, использование
Код
/* Неочевидное перенаправление на страницу 404-ой ошибки */
AddEventHandler("main", "OnEpilog", "Redirect404");
function Redirect404() {
if(defined("ERROR_404") ) {
LocalRedirect("/404.php", "404 Not Found");
}
}
также не решает проблемы, все тот же 302 редирект и статус 200. Может кто-нибудь помочь, или дать понять где подвох?
Проблему 302 редиректа решил, но пришлось лезть в глубь битрикса. В
Код
bitrix\modules\main\tools.php
изменил описание LocalRedirect:
Код
function LocalRedirect($url, $skip_security_check=false, $status="302 Moved") \\ было
function LocalRedirect($url, $skip_security_check=false, $status="301 Moved Permanently") \\ стало
Но не считаю этот выход оптимальным, так как при каждом обновлении надо будет снова пилить.. Может кто знает как это можно сделать по другому?
О черт... Что же это? Ненайденная страница постоянно перемещена на ненайденную станицу? Ад какой.
Цитата
Также страница 404.html отдает статус 200 а не 404, как с этим быть?
А с чего бы существующей странице отдавать статус что она не существует?
Опишите чего вы хотите добится-то? Т.е. в чем собственно проблема? А то пока ваши вопросы исключительно философские - почему страница существует если она существует и т.п.
CEOшники захотели чтобы при попадание на несуществующею страницу происходил 301 редирект на статическую страницу 404.html и чтоб эта страница после редиректа отдавала статус 404
Сеошникам неплохо бы что нибудь почитать про интернет, сайты. Покажите им кстати компьютер и браузер - я думаю для них это будет полезно и в работе пригодится. Ничего хорошего от того что на любую страницу ваш сайт будет отдавать 301, а потом 404 не будет кроме того что вам тиц и PR опустят штрафами, не будет. 404 после 301 это очень и очень плохо. Ну представьте что вы по всему городу развесите билборды с указанием того что офис вашей компании переехал с этого места на такой-то адрес, а адреса этого и нет. Вот что будет?
Но если прямо очень надо, то в станртной 404.php сделайте LocalRedirect('/404.html',301), в Обработке адресов правило "#^/404.html" и файл "/404_404.php" и в него поместите то что у вас сейчас в 404.php.
А потом товар 2 сняли с продаж но в поисковиках он остался проиндексированным, нужно чтоб при переходе по ссылке на него происходил 301 редирект на 404.html. Остальные товары же как положено отдают 200.
Цитата
Suntechnic пишет: Но если прямо очень надо, то в станртной 404.php сделайте LocalRedirect('/404.html',301)
Вот это и сделал, а вот по следующему пункту непонятно
Цитата
Suntechnic пишет: в Обработке адресов правило "#^/404.html" и файл "/404_404.php" и в него поместите то что у вас сейчас в 404.php.
Andrijawuk пишет: Suntechnic, 301 редирект идет не со всех страниц а только с несуществующих, тоесть если раньше у меня были ссылки:
Ну если такой редирект идет только со страниц которые существовали ранее, то тогда в этом есть нечто что отдаленно похоже на разумное зерно. Хотя смысл его для меня остается загадкой - так быть все равно не должно.
Цитата
Andrijawuk пишет: Теперь при переходе по битому урлу происходит просто редирект, даже статус 200 не возвращается
Редирект куда? Что выводится? И еще один вопрос для того чтобы вы больше сами подумали, но и нам ответили - а как вы понимаете что вам статус 200 пришел, а не 404?
Suntechnic, статус отслеживаю с помощью firebug ( Firebug -> Net)
Да, редирект происходит и даже страница 404.html загружается - но ложкой дегтя остается 200 статус страницы 404.html. В принципе логично, что раз уж она существует то с чего бы это отдавать "404 Not Found".
Обработка адресов не срабатывает, в описании нашёл такое:
Адрес, по которому будет отвечать скрипт, не должен физически существовать на сервере. Если такой адрес физически существует, то будет вызван скрипт по этому адресу. Система обработки адресов запущена в этом случае не будет.
Если 404.html удалить - происходит циклическая переадресация, получаем 503
А как нужно, вот пример сайта на котором все работает: http:// rozetka.com.ua
Andrijawuk пишет: Если 404.html удалить - происходит циклическая переадресация, получаем 503
Ну так реврайт же уберите из 404_404.php. Первую строчку удалите. Как-то осмысленно же надо советам следовать... Хотя наверно я тоже виноват просто написав "сокпируйте". Вобщем сделайте прямо вот так в 404.php:
Но это решения для случая который вы объяснили с самого начала. Для того, чтобы 301 редиеркт шел только со страниц которые когда-то были надо их как-то детектировать.
kopoBko, побеседовал с СЕОшниками, оказалось что им до лампочки .html или .php, так что спасибо, впредь буду думать, а потом делать)
Suntechnic, Спасибо за помощь, сделал все практически так как вы советовали, теперь у меня файл 404,php редиректит на 404_404.php а уже там я отдаю стат 404, без всяких html файлов.