301 редирект. Шпаргалка по mod_rewrite
Любой вебмастер не раз сталкивался с необходимостью сделать 301 редирект (при изменение адреса страницы, склейке доменов, удалении дублей). Один из самых простых способов задания 301 редиректа - использовать механизм mod_rewrite, позволяющий переобразовывать URL «на лету».
Данная шпаргалка содержит набор директив, флагов и переменных, подсказки по синтаксису регулярных выражений, используемых mod_rewrite, а так же примеры наиболее популярных шаблонов.
| ^ | начало строки |
| $ | конец строки |
| . | любой одиночный символ |
| (a|b) | «a» или «b» |
| (…) | группа |
| [abc] | «a» или «b» или «c» |
| [^abc] | не «a», не «b» и не «c» |
| \s | Пробел |
| a? | 0 или 1 символ «а» |
| a* | 0 или больше «а» |
| a*? | 0 или больше «а», нежадный |
| a+ | 1 или больше «а» |
| a+? | 1 или больше «а», нежадный |
| a{3} | ровно 3 символа «а» |
| a{3,} | 3 или больше «а» |
| a{3,6} | от 3 до 6 «а» |
| a{3,6}? | от 3 до 6 «а», нежадный |
| !(…) | Префикс «не» (действует если шаблон не подходит) |
| NC | Не учитывать регистр |
| OR | Комбинировать по принципу «или» |
| R[=code] | Редирект, опционально с кодом |
| F | Доступ запрещен (посылает 403 заголовок) |
| G | «Мертвая» страница (удалена) |
| P | Прокси |
| L | Последнее правило |
| N | Следующий круг |
| C | Цепочка |
| T=mime-type | Установить MIME-тип |
| NS | Пропустить внутренний подзапрос |
| NC | Не учитывать регистр |
| QSA | Добавить строку запроса |
| NE | Не экранировать при выводе |
| PT | Пропустить через следующий |
| S=x | Пропустить следующие х правил |
| E=var:value | Установить переменную окружения |
| 301 | Перенесен постоянно |
| 302 | Перенесен временно |
| 403 | Доступ запрещен |
| 404 | Страница не найдена |
| 410 | «Мертвая» страница |
| Переменные: HTTP заголовки | Переменные: время |
|---|---|
| %{HTTP_USER_AGENT} | %{TIME_YEAR} |
| %{HTTP_REFERER} | %{TIME_MON} |
| %{HTTP_COOKIE} | %{TIME_DAY} |
| %{HTTP_FORWARDED} | %{TIME_HOUR} |
| %{HTTP_HOST} | %{TIME_MIN} |
| %{HTTP_PROXY_CONNECTION} | %{TIME_SEC} |
| %{HTTP_ACCEPT} | %{TIME_WDAY} |
| %{TIME} | |
| Переменные: запрос | Переменные: сервер |
| %{REMOTE_ADDR} | %{DOCUMENT_ROOT} |
| %{REMOTE_HOST} | %{SERVER_ADMIN} |
| %{REMOTE_IDENT} | %{SERVER_NAME} |
| %{REQUEST_METHOD} | %{SERVER_ADDR} |
| %{SCRIPT_FILENAME} | %{SERVER_PORT} |
| %{PATH_INFO} | %{SERVER_PROTOCOL} |
| %{QUERY_STRING} | %{SERVER_SOFTWARE} |
| %{AUTH_TYPE} | |
| Переменные: специальные | Директивы |
| %{API_VERSION} | RewriteEngine |
| %{THE_REQUEST} | RewriteOptions |
| %{REQUEST_URI} | RewriteLog |
| %{REQUEST_FILENAME} | RewriteLogLevel |
| %{IS_SUBREQ} | RewriteLock |
| RewriteMap | |
| RewriteBase | |
| RewriteCond | |
| RewriteRule |
301 редирект. Популярные шаблоны
Для того чтобы нижеизложенные шаблоны работали нужно перед их использованием прописать в файле .htaccess директивы для модуля mod_rewrite:
Options +FollowSymLinks RewriteEngine On RewriteBase /
Склейка домена (префикс www)
www.example.com и example.com в глазах поискового работа — абсолютно разные сайты, каждый со своими показателями. Для того чтобы не распылять вес, склеиваем эти адреса
Редирект с адреса www на адрес без www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http: // %1/$1 [R=301,L]
Редирект с адреса без www на адрес с www
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http: //www .%1/$1 [R=301,L]
Зачастую главная страница вашего сайта доступна по нескольким адресам: example.com/ и example.com/index.php или example.com/index.html. Для склейки таких дублей, используем следующий шаблон:
Склейка индексной страницы с корнем сайта
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index \.php\ HTTP/
RewriteRule ^index\.php$ http: //example .com/ [R=301,L]
Склейка поддомена и папки
Иногда возникает необходимость сделать 301 редирект с поддомена на папку сайта. Например у вас есть страница category.example.com/page/ и вам нужно склеить ее с дублирующей страницей example.com/category/page/. Прописывем в файле .htaccess поддомена:
Редирект с поддомена на папку основного домена
RewriteCond %{HTTP_HOST} ^category\.example\.com [OR]
RewriteCond %{HTTP_HOST} ^category\.example\.com
RewriteRule ^(.*)$ http: //example .com /category/ $1 [L,R=301]
При необходимости наоборот перенаправить с папки на поддомен:
Редирект с папки основного домена на поддомен
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^category\/(.*)$ http: //category .example.com/$1 [R=301,L]
Редирект с одних расширений файлов на другие
Если вам необходимо сменить расширение файла в адресе (например page.html на page.php) или убрать его совсем:
RewriteRule ^(.*)\.html$ $1.php [R=301,L]
Редирект на другой сайт
При создании зеркала сайта либо переезде на новый домен, для склейки и перенаправления используем следующую конструкцию:
RewriteCond %{HTTP_HOST} ^oldsite\.com
RewriteRule ^(.*)$ http: //newsite .com/$1 [R=301,L]
Все страницы домена oldsite.com будут перенаправлены на соответствующие страницы newsite.com.
301 Редирект динамических страниц
При модернизации динамического сайта и создании ЧПУ-адресов часто возникает необходимость перенаправить старые страницы с параметрами ID на новые с ЧПУ. Например, чтобы переадресовать страницу вида http://example.com/page.php?id=13 на новую страницу http://example.com/new-url/, используется следующая конструкция:
RewriteCond %{QUERY_STRING} ^ id =13$
RewriteRule ^ /page .php$ http: //example .com /new-url/ [L,R=301]
Добавляем слеш в конце адреса
Если у вас на сайте реализованы ЧПУ адреса тем или иным способом, то вероятно ваши ссылки могут работать либо со «/» на конце адреса либо без него одинаково. Добавим однозначности и добавим слеш ко всем адресам.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]







Комментариев: 1
Помогите вырезать часть url в адресе. Сейчас ссылка такого вида: http://site.ru/catalog/pages/pages.php?cat_id=3&page_id=125 Нужно сделать такой вид: http://site.ru/catalog/pages/pages.php?page_id=125 Как правильно удалить: cat_id=3&