воскресенье, 24 июля 2016 г.

301 редирект: популярные шаблоны

Каждый оптимизатор сталкивается с необходимостью использования 301 редиректа. Часто эта необходимость возникает при изменении адресов страниц, склейке доменов, удалении дублей и решении других задач. В данном руководстве собраны наиболее популярные шаблоны 301 редиректов.

Поскольку веб-сервер Apache является наиболее распространенным, то все шаблоны, приведенные в данной статье, относятся именно к нему, а конкретно — должны прописываться в корневом файле .htaccess. Перед использованием шаблонных 301 редиректов убедитесь в том, что в Apache подключен модуль mod_rewrite (файл httpd.conf).
Для использования 301 редиректа сначала в первых строках файла .htaccess прописываются директивы, необходимые для работы модуля mod_rewrite:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
Рассмотрим типичные правила перенаправлений.

Редирект с адреса с www-префиксом на адрес без www

Подобные перенаправления переадресуют все страницы сайта вида http://www.site.com.ua/page.html на страницы http://site.com.ua/page.html. Для такого типа редиректа можно использовать следующий шаблон:
RewriteCond %{HTTP_HOST} ^www\.site\.com\.ua$ [NC]
RewriteRule ^(.*)$ http://site.com.ua/$1 [R=301,L]
Или же упрощенный вариант:
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Редирект с адреса без www на адрес с www

Этот 301 редирект со страниц домена вида http://site.com.ua/page.html на страницы http://www.site.com.ua/page.html делается подобным описанному выше методу, только меняется положение www:
RewriteCond %{HTTP_HOST} ^site\.com\.ua$ [NC]
RewriteRule ^(.*)$ http://www.site.com.ua/$1 [R=301,L]
Или альтернативный упрощенный вариант:
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Стоит также отметить, что иногда правила работают даже если точки не экранированы с помощью обратного слэша, но не стоит этим злоупотреблять, на некоторых серверах это может привести к ошибке.

Склейка индексной страницы с корнем сайта

Такой тип редиректов часто доставляет проблемы в случае, если используется CMS, перенаправляющая все запросы к сайту на индексную страницу. Добавление директивы в .htaccess файл тогда приведет к циклу бесконечных перенаправлений. Самым простым выходом из ситуации будет вставка небольшого фрагмента кода в начало индексной страницы (например index.php):
if($_SERVER[‘REQUEST_URI’] == "/index.php") {
header("Location: /",TRUE,301);
exit();
}
Таким образом, при обращении к индексной странице сравнивается, если запрошенный адрес равен, к примеру, http://site.ua/index.php, то условие срабатывает и происходит переадресация на корень сайта http://site.ua/. Если сайт не перенаправляет все запросы на index.php можно воспользоваться следующим шаблоном для mod_rewrite:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com.ua/ [R=301,L]
Такой же редирект может использоваться и для других расширений главной страницы, таких как index.html, или например index.phtml.

Редирект с поддомена на подпапку

Такая разновидность 301 редиректа нужна для перенаправления многочисленных однотипных страниц с поддомена на новые адреса, имеющие определенный шаблон. Такая задача часто возникает, например, когда другая языковая версия сайта доступна на поддомене и в подпапке основного домена.
Пусть, к примеру, есть страница с адресом http://eng.site.com.ua/page.html и нам нужно склеить ее с дублирующей страницей http://site.com.ua/eng/page.html. Используем для этого следующий шаблон (прописывается для .htaccess файла поддомена):
RewriteCond %{HTTP_HOST} ^www\.eng\.site\.com\.ua [OR]
RewriteCond %{HTTP_HOST} ^eng\.site\.com\.ua
RewriteRule ^(.*)$ http://www.site.com.ua/eng/$1 [L,R=301]

Редирект с подпапки домена на поддомен

Если необходимо наоборот, перенаправить пользователя с подпапки на поддомен, то используйте следующий шаблон:
RewriteCond %{HTTP_HOST} ^site\.com\.ua$ [NC]
RewriteRule ^\/eng\/(.*)$ http://eng.site.com.ua/$1 [R=301,L]

Редирект с одних расширений файлов на другие

При смене движка либо при переходе со статической версии сайта на динамическую следует оставить доступность страниц по старым адресам. Для этого старые адреса страниц необходимо направить на страницы с новым расширением.
RewriteRule ^(.*)\.html$ $1.php [R=301,L]

Редирект на другой сайт

Создавая новый сайт, бывает необходимость сделать его основным зеркалом, перенаправляя пользователей со старого домена на новый. Для этого можно использовать шаблон приведенный ниже.
RewriteCond %{HTTP_HOST} ^oldsite\.com\.ua
RewriteRule ^(.*)$ http://newsite.com.ua/$1 [R=301,L]
Все страницы старого домена будут перенаправлены на соответствующие страницы нового.

301 Редирект динамических страниц

При модернизации динамического сайта и создании ЧПУ-адресов часто возникает необходимость перенаправить старые страницы с параметрами ID на новые с ЧПУ. Например, чтобы переадресовать страницу вида http://site.com.ua/page.php?id=13 на новую страницу http://site.com.ua/newname.html, используется следующая конструкция:
RewriteCond %{QUERY_STRING} ^id=13$
RewriteRule ^/page.php$ http://site.com.ua/newname.html [L,R=301]

Редиректы кириллических и .рф доменов

Все описанные выше правила справедливы и для доменов написанных кириллицей. Однако, при создании перенаправлений кириллические домены лучше заменять так называемымPunycode. Для этого можно воспользоваться одним из онлайн-сервисов конвертацииWhiteWhois.
Полученное закодированное доменное имя можно легко использовать для любого шаблона 301 редиректа, описанного выше.
Несмотря на обилие различных шаблонов и готовых решений, лучшим решением является самостоятельное освоение принципов работы mod_rewrite и синтаксиса его директив. Понимание базовых конструкций позволит с легкостью писать свои редиректы, а также читать и исправлять существующие .htaccess файлы.

0 коммент.:

Отправить комментарий