При использовании 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 убрать дубли страниц?
Всё очень просто:
- Включаем в UrlManager параметр ‘useStrictParsing’=>true:
- Проверяем урл на наличие в нём 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();
}
}