Убираем дубликаты URL в Yii
17 ноября 2013
Не первый раз спрашивают как убрать дубликаты URL в приложении на Yii при использовании красивых URL и showScriptName = false
. Yii при включении данной опции генерирует все URL как надо, но позволяет обращаться к страницам и так и так:
http://example.com/blog/tag/Yii
http://example.com/index.php/blog/tag/Yii
На самом деле никакой проблемы в этом нет потому как ни одной ссылки на второй тип URL не будет и он, соответственно, не проиндексируется. Но так как вопросы поступают и SEO-шники настаивают, вот ответ в виде gist.
Сохраняем в виде protected/components/DuplicateFilter.php
, прописываем в метод filters
контроллеров и забываем о проблеме.
Комментарии RSS по email OK
Проблема будет если соперник/злоумышленник засветит где ни будь эти адреса намеренно.
BS, внутренние ссылки все-равно будут генерироваться без index.php
Сеошники плохие. Хорошие исправят ситуацию 1 строчкой в robots.txt: «Disallow: /index.php».
Я бы вообще сделал:
Поправка:
А если то же самое проделать, но апачем? Не все же NGINX используют.
Я вот так решил задачу, в файле Controller.php в метод init() добавил
Теперь если перейти на myhost.ru/index.php то увидим пустую страницу
"Соперникам/злоумышленникам" никто не помешает понаставить урлов вида example.com/настоящийурл/кучабессмысленныхдоппараметров, безо всякого index.php
Гугл когда-то выкатил пояснительную записку, из которой следует, что они в курсе о существовании дублирующихся урлов, и им на это пофиг.
Для пущей ясности достаточно прописывать canonical URL. Типа, пускай открывается по любому урлу, но истинный адрес записи - такой-то.
Делаешь каноникал тег с единственным источником и забивашеь на все редиректы.
А насколько верно делать редирект? Мне кажется логично будет, если сервер будет отвечать, что нет такой страницы?
Появился такой вопрос: если использовать этот фильтр как он есть, то localhost/index.php получается пустой, на неё редирект не распространяется. Стоит ли '~^/index.php(.)~' заменить на '~^/index.php/(.)~' ?
или ещё лучше с localhost/index.php перенаправлять на localhost/
А разве эта проблема не решается файлом robots.txt?