Настройка редиректов в .htaccess

В данной заметке-памятке рассматриваются приемы установки редиректов в файле .htaccess на все случаи жизни: С www на без www, с http на https, с поддомена на домен. Цель написания данной заметки — сохранить эти приемы в одном месте, а не снова бегать по интернету в поисках решения, когда возникнет такая потребность.

Файл .htaccess, как правило, лежит в корневой папке сайта. В нем и происходит вся работа, описанная ниже. Редиректы даются «как есть», без обширных пояснений. Теоретическая основа для файла .htaccess — это, в самом деле, тема отдельной статьи.

Какие бывают редиректы?

Чаще всего говорится от 301-редиректе. Из этого утверждения можно сделать вывод, что существуют еще какие-то редиректы. Они бывают следующих видов:

301-й редирект — постоянная переадресация. Действительно, он используется чаще остальных.

302, 303 и 307 — обозначают временную переадресацию. При таком редиректе предполагается, что страница, с которой идет редирект, перенесена временно и в будущем будет доступна по старому адресу.

Варианты настройки редиректа с www на без www в .htaccess

В этом разделе приведены самые простые варианты, расширенный вариант будет ниже (в разделе «редирект с http://www… на https://…«). К слову, с «поддомена»

  1. Первый вариант (Имейте ввиду, что «вашсайт» нужно заменить на реальный адрес сайта):
    <IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.вашсайт\.ru$ [NC]
    RewriteRule ^(.*)$ http://вашсайт.ru/$1 [R=301,L]
    </IfModule>
  2. Второй вариант:
    <IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    </IfModule>
  3. Третий вариант:
    <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

  1. Первый вариант:
    RewriteEngine On
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
  2. Второй вариант:
    RewriteEngine On
    RewriteCond %{HTTPS} =off 
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
  3. Третий вариант:
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  4. Четвертый вариант
    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.

Почему может не работать какой-либо из способов?

  1. [Наиболее распространенная] Ошибка в синтаксисе директив
  2. Ограничения CMS для файла .htaccess (по крайней мере, reg.ru пишет об этом в своей справке)
  3. Какие-либо проблемы с хостингом. Маловероятно, но решается через техподдержку, как правило.

Редирект средствами php 

Редирект через php больше подходит для отдельных страниц. В частности, автор использовал его для редиректа с /personal/cart/ на /cart/. Возможно 2 варианта записи редиректа на php:

  1. Первый:
    <?php
    
    header('Location: http://alexryabikov.ru/red.php',true, 301);
    
    ?>
  2. Второй:
    <?php
    
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: http://alexryabikov.ru/red.php');
    
    ?>

Обратите внимание, что функция редиректа всегда должна стоять в начале php-файла. В противном случае вы не получите ничего, кроме ошибки. Например, если это комбинированная страница с html, то функция редиректа должна вызываться на первой строке (Даже раньше тега <html>, если он есть в данном файле.).

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