301 редирект. Шпаргалка по mod_rewrite

Декабрь, 17th 2016Рубрика: Web-мастеринг 2491
Подписаться на комментарии по RSS

Любой вебмастер не раз сталкивался с необходимостью сделать 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 «а», нежадный
!(…) Префикс «не» (действует если шаблон не подходит)
Флаги RewriteCond
NC Не учитывать регистр
OR Комбинировать по принципу «или»
Флаги RewriteRule
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]

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

comments powered by HyperComments
Без регистрации
ваш комментарий будет опубликован после проверки
Регистрация на сайте

На указанный адрес будет отправлено письмо с кодом активации. Вы можете настроить собственный профиль и стать активным участником или автором.