<rmcreative>

RSS

Убираем дубликаты 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

  1. №8570
    BS
    BS 17.11.2013, 17:43:32

    Проблема будет если соперник/злоумышленник засветит где ни будь эти адреса намеренно.

  2. №8571
    100grammist
    100grammist 17.11.2013, 19:01:49

    BS, внутренние ссылки все-равно будут генерироваться без index.php

  3. №8572
    ref
    ref 17.11.2013, 21:06:23

    Сеошники плохие. Хорошие исправят ситуацию 1 строчкой в robots.txt: «Disallow: /index.php».

  4. №8573
    ElisDN
    ElisDN 17.11.2013, 22:03:31

    Я бы вообще сделал:

    ksort($_GET);
    $url = Yii::app()->controller->createUrl('', $_GET);
    if (Yii::app()->request->getUrl() != $url) {
        Yii::app()->controller->redirect($url);
    }
  5. №8574
    ElisDN
    ElisDN 17.11.2013, 23:06:44

    Поправка:

    Yii::app()->controller->redirect($url, 301);
  6. №8575
    morontt
    morontt 18.11.2013, 0:20:16

    А если то же самое проделать, но апачем? Не все же NGINX используют.

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{CONTEXT_PREFIX}/$2 [R=301,L]
  7. №8581
    DK
    DK 19.11.2013, 15:07:55

    Я вот так решил задачу, в файле Controller.php в метод init() добавил

    if (strpos($_SERVER['REQUEST_URI'], 'index.php') !== FALSE) {
                throw new CHttpException(404, 'The requested page does not exist.');
            }
  8. №8583
    Jose
    Jose 19.11.2013, 18:22:28

    Теперь если перейти на myhost.ru/index.php то увидим пустую страницу

  9. №8584
    ORey
    ORey 19.11.2013, 19:15:07

    "Соперникам/злоумышленникам" никто не помешает понаставить урлов вида example.com/настоящийурл/кучабессмысленныхдоппараметров, безо всякого index.php

    Гугл когда-то выкатил пояснительную записку, из которой следует, что они в курсе о существовании дублирующихся урлов, и им на это пофиг.

    Для пущей ясности достаточно прописывать canonical URL. Типа, пускай открывается по любому урлу, но истинный адрес записи - такой-то.

  10. №8587
    Roman
    Roman 20.11.2013, 1:41:37

    Делаешь каноникал тег с единственным источником и забивашеь на все редиректы.

  11. №8605
    Александр
    Александр 21.11.2013, 7:15:52

    А насколько верно делать редирект? Мне кажется логично будет, если сервер будет отвечать, что нет такой страницы?

  12. №8718
    BS
    BS 30.12.2013, 14:12:05

    Появился такой вопрос: если использовать этот фильтр как он есть, то localhost/index.php получается пустой, на неё редирект не распространяется. Стоит ли '~^/index.php(.)~' заменить на '~^/index.php/(.)~' ?

  13. №8719
    BS
    BS 30.12.2013, 14:47:33

    или ещё лучше с localhost/index.php перенаправлять на localhost/

  14. №8992
    ErgoZ
    ErgoZ 28.04.2014, 9:52:52

    А разве эта проблема не решается файлом robots.txt?

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.