При использовании 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(); } }