В данной заметке-памятке рассматриваются приемы установки редиректов в файле .htaccess на все случаи жизни: С www на без www, с http на https, с поддомена на домен. Цель написания данной заметки — сохранить эти приемы в одном месте, а не снова бегать по интернету в поисках решения, когда возникнет такая потребность.
Файл .htaccess, как правило, лежит в корневой папке сайта. В нем и происходит вся работа, описанная ниже. Редиректы даются «как есть», без обширных пояснений. Теоретическая основа для файла .htaccess — это, в самом деле, тема отдельной статьи.
Какие бывают редиректы?
Чаще всего говорится от 301-редиректе. Из этого утверждения можно сделать вывод, что существуют еще какие-то редиректы. Они бывают следующих видов:
301-й редирект — постоянная переадресация. Действительно, он используется чаще остальных.
302, 303 и 307 — обозначают временную переадресацию. При таком редиректе предполагается, что страница, с которой идет редирект, перенесена временно и в будущем будет доступна по старому адресу.
Варианты настройки редиректа с www на без www в .htaccess
В этом разделе приведены самые простые варианты, расширенный вариант будет ниже (в разделе «редирект с http://www… на https://…«). К слову, с «поддомена»
- Первый вариант (Имейте ввиду, что «вашсайт» нужно заменить на реальный адрес сайта):
<IfModule mod_rewrite.c> Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.вашсайт\.ru$ [NC] RewriteRule ^(.*)$ http://вашсайт.ru/$1 [R=301,L] </IfModule>
- Второй вариант:
<IfModule mod_rewrite.c> Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] </IfModule>
- Третий вариант:
<IfModule mod_rewrite.c> Options +FollowSymLinks RewriteEngine On RewriteCond %{HTTP_HOST} !^site\.ru$ [NC] RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L] </IfModule>
Редирект с поддомена на домен:
RewriteCond %{HTTP_HOST} ^(.+).domain.ru$ RewriteRule ^/(.*)$ http://www.domain.ru/$1 [R=301,NC]
Варианты настройки редиректа с http на https в .htaccess
- Первый вариант:
RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
- Второй вариант:
RewriteEngine On RewriteCond %{HTTPS} =off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
- Третий вариант:
RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- Четвертый вариант
RewriteEngine On RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Редирект с http://www… на https://…
Расширенный вариант, который автор данной заметки обнаружил «на просторах», когда столкнулся с проблемой, при которой не работали перечисленные выше способы. Правда, как оказалось потом, проблема была не в редиректах, а в сервере.
# 1. Удалить www RewriteCond %{ENV:HTTPS} on #Если включен https RewriteRule .* - [E=SSL:s] #То создаем переменную ssl с текстом s RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] # Проверяем, содержит ли домен www в начале URL. RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L] # Перенаправляем удаляем www
Естественно, что этот код также должен вставляться после RewriteEngine On.
Почему может не работать какой-либо из способов?
- [Наиболее распространенная] Ошибка в синтаксисе директив
- Ограничения CMS для файла .htaccess (по крайней мере, reg.ru пишет об этом в своей справке)
- Какие-либо проблемы с хостингом. Маловероятно, но решается через техподдержку, как правило.
Редирект средствами php
Редирект через php больше подходит для отдельных страниц. В частности, автор использовал его для редиректа с /personal/cart/ на /cart/. Возможно 2 варианта записи редиректа на php:
- Первый:
<?php header('Location: http://alexryabikov.ru/red.php',true, 301); ?>
- Второй:
<?php header('HTTP/1.1 301 Moved Permanently'); header('Location: http://alexryabikov.ru/red.php'); ?>
Обратите внимание, что функция редиректа всегда должна стоять в начале php-файла. В противном случае вы не получите ничего, кроме ошибки. Например, если это комбинированная страница с html, то функция редиректа должна вызываться на первой строке (Даже раньше тега <html>, если он есть в данном файле.).
В общем и целом, на этом можно заказнчивать данную заметку. Ведь в ней перечислены практически все варианты редиректов, которыми пользуется автор.