Подскажите пожалуйста, у меня Prestashop раз в несколько дней почему то перегенерирует этот файл. И опять вылазят 404. Приходится постоянно следить и в ручную его прописывать, может быть есть другие методы?
Пара слов о хорошем:
На нативном php эту задачу можно решить добавив в начале индексного файла вот такой код:
Код:
<?php
if(preg_match('~.+\.html$~', $_SERVER['REQUEST_URI']))
{
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '.html', true, 301);
exit();
}
?>
В данном случае под индексным файлом я подразумеваю первый файл, который выводит какие-либо данные. Если первым файлом включается не index.php, а header.php - код нужно добавлять именно в него.
Обращаю внимание на то, что данный код будет работать "правильно" если на сайте не используются параметры. Если используются - будет дописываться в конец параметров .html . Поэтому для работы с параметрами нужно писать правило с preg_replace и для написания нормальной переадресации - нужно писать правила по живому параллельно тестируя их. В общем то всё не сложно было бы, НО:
пара слово плохом:
коль мне не изменяет память - престашоп использует шаблонизатор smarty, а он не шибко дружит со вставкой php-костылей в файлы темплейтов...
Я теоретически представляю как нужно поправить код, что б он заработал, но ввиду небольшого опыта работы со смарти - могу где-то ошибиться и код не будет срабатывать. Как уже говорилось - желательно проводить тесты по живому проекту...
Собственно 3 варианта как добавить адаптированный код. Его нужно вставить в тот *.tpl , который грузится первым (вроде header.tpl)
1:
Код:
{if preg_match('~.+\.html$~', $_SERVER['REQUEST_URI'])}
{header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '.html', true, 301);}
{exit();}
{/if}
2:
Код:
{literal}
<?php
if(preg_match('~.+\.html$~', $_SERVER['REQUEST_URI']))
{
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '.html', true, 301);
exit();
}
?>
{/literal}
3:
Код:
{php}
if(preg_match('~.+\.html$~', $_SERVER['REQUEST_URI']))
{
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '.html', true, 301);
exit();
}
{/php}
И опять же - если на сайте есть страницы с параметрами - их нужно будет обрабатывать дополнительно. В случае с htaccess никаких танцев с бубном не требовалось. Если ведется контекстная реклама со ссылками с utm метками - нужно править условие if что б не учитывало страницы с параметрами, например вот так:
Код:
<?php
if(preg_match('~.+\.html$~', $_SERVER['REQUEST_URI']) && $_SERVER['QUERY_STRING'] == '')
{
header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '.html', true, 301);
exit();
}
?>
Но это правило решит вопрос с параметрами контекстной рекламы (это если изначально там настроены нормально URL адреса в кампании), но не решит вопросов других страниц, которые юзают параметры.
PS: извиняюсь, если описал не понятно. Если что - уточняйте