Вообще говоря, ссылок на неЧПУ страницы быть не должно и поисковики вообще не должны о них знать и даже догадываться об их существовании.
Но, если неЧПУ страницы все же когда-либо где-либо "засветились", то для поисковиков будет достаточно прописать на страницах
мета-тэг canonical со ссылкой на ЧПУ страницу.
Это самый простой и правильный способ (если говорим лишь о поисковиках), однако, может возникнуть необходимость скрыть партнерский движок, чтобы URL-ы стандартных страниц не открывались вообще, а были доступны лишь ЧПУ-шные URL-ы. Такое тоже возможно.
Разберем этот способ на примере страниц категорий, сейчас у нас категории открываются по URL
/cat.php?cat=xxx. А надо сделать чтобы категории открывались о URL
/cat-xxx.htm и при этом попытка открыть
/cat.php?cat=xxx возвращала бы 404 (страница не существует).
Начинаем .htaccess стандартно:
Код:
AddDefaultCharset windows-1251
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
Задали кодировку, включили mod_rewrite и опцию доступа к сим.линкам, а так же задали базу /, чтобы постоянно её в правилах не указывать.
Так и напрашивается решение:
Код:
RewriteRule ^cat-(.*)\.htm$ cat.php?cat=$1 # Подменить cat-xxx.htm на cat.php?cat=xxx
RewriteRule ^cat.php - [R=404] # Запретить доступ к cat.php
Но, оно не сработает, и вот почему: обработка правил mod_rewite происходит
итерационно, в несколько проходов. На первом проходе запрос cat-xxx.htm преобразуется в cat.php?cat=xxx, и поскольку сработало хоть одно правило, будет запущен второй проход, снова по всему списку правил. И уже на втором проходе cat.php?cat=xxx будет преобразован в ошибку 404. Т.е. обращаясь по URL cat-xxx.htm мы получим ошибку 404. Это произойдет из-за того, что mod_rewrite делает несколько проходов по правилам.
Чтобы этого избежать и заставить все работать как надо - воспользуемся переменными окружениями, перепишем наше первое правило так:
Код:
RewriteRule ^cat-(.*)\.htm$ cat.php?cat=$1 [L,E=FLAG:1]
Оно преобразует запросы вида /cat-xxx.htm в /cat.php?cat=xxx. При этом, в квадратных скобках указаны дополнительные флаги:
L - завершить текущий проход по списку правил mod_rewrite и приступить сразу к следующему проходу (это сэкономит время на обработку и убережет от возможного влияния правил, указанных дальше), а так же флаг
E - установить значение переменной окружения FLAG в единицу.
Теперь, в следующем правиле, мы будем выдавать при обращении к /cat.php ошибку 404
лишь в том случае, если не была установлена переменная окружения FLAG, т.е. если это не второй проход по правилам, а действительно запрос к /cat.php. Для этого запишем правило используя
RewriteCond:
Код:
RewriteCond %{ENV:REDIRECT_FLAG} ^$
RewriteRule ^cat.php$ - [L,R=404]
Особо отмечу что к названию переменной окружения добавляется префикс REDIRECT_, поэтому устанавливали мы FLAG, а проверяем REDIRECT_FLAG
Надеюсь объяснение получилось понятным. Для особо ленивых привожу весь .htaccess:
Код:
AddDefaultCharset windows-1251
RewriteEngine on
Options +FollowSymlinks
RewriteBase /
RewriteRule ^cat-(.*)\.htm$ cat.php?cat=$1 [QSA,L,E=FLAG:1]
RewriteCond %{ENV:REDIRECT_FLAG} ^$
RewriteRule ^cat.php$ - [L,R=404]
А так же напоминаю, что mod_rewrite правила в .htaccess лишь обрабатывают запрашиваемые URL, но не преобразуют ссылки href в html, так что для корректной работы ЧПУ сайта требуется не только прописать правила в .htaccess, но и заменить ссылки <a href="..."> в соответствующих tmpl-файлах каталога /theme/