Как в Yii убрать дубли страниц

  • 3 859
  • Нет комментариев
url

При использовании Yii UrlManager с опцией ‘urlFormat’=>’path’ (ЧПУ) могут появляться дубли страниц. И хотя говорят, что поисковые роботы эти странице не проиндексируют (т.к. на них не ссылается ни одна страница), все же SEO’шники против таких дублей страниц.

К счастью в UrlManager можно использовать параметр ‘useStrictParsing’=>true. Тогда для каждого урла нужно прописывать правила, иначе он не откроется. Всё казалось бы хорошо, но и в таком режиме получаются дубли, т.к. страница становится доступна по следующим адресам:

  • site.com/post/rock
  • site.com/index.php?r=post/rock
  • site.com/index.php/post/rock

Красным цветом я пометил нежелательные дубли.

Итак, как же в Yii убрать дубли страниц?

Всё очень просто:

  1. Включаем в UrlManager параметр ‘useStrictParsing’=>true:
  2. Проверяем урл на наличие в нём index.php и ?r=. Если найдены эти две строки, то кидаем 404 ошибку.

Проверить урла на наличие index.php и ?r= можно с помощью следующего кода (просто положите этот код в родительский контроллер (components/controller.php)):

/**
 * Проверка урла на дубли
 * @throws CHttpException
 */
public function init()
{
    $request = Yii::app()->request->requestUri;
    $code = 404;
    $message = 'Страница не найдена';

    // Проверяем, если есть в урле index.php или ?r=, то кидаем 404 ошибку
    if ((strpos($request, 'index.php') !== false) || (strpos($request, '?r=') !== false))
    {
        // Если это не контроллер по-умолчанию, то кидаем 404 ошибку обычным способом
        if (Yii::app()->controller->id !== Yii::app()->defaultController)
            throw new CHttpException($code, $message);

        // Если это контроллер по-умолчанию, кидаем 404 ошибку необычным способом.
        header('HTTP/1.0 404 Not Found');
        // Отображаем стандартное представление ошибки
        $this->render(Yii::app()->errorHandler->errorAction, array(
            'code' => $code,
            'message'=> $message
        ));
        // Выходим из приложения
        Yii::app()->end();
    }
}
Понравилась статья? Оцени её!
Комментарии (0)
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *