Как сделать редиректы в .htaccess?

В данной статье мы рассмотрим, какие редиректы и как можно сделать при помощи .htaccess
Данная инструкция актуальна для веб-серверов, работающих с Apache (на всех наших услугах хостинга они будут работать безотказно). Чтобы правила начали работать, создайте или откройте файл .htaccess, расположенный в корневой папке Вашего сайта.

Редирект с HTTP на HTTPS

После добавления одного из правил Вам необходимо сохранить данный файл и Ваш редирект будет работать корректно. 

Первый вариант

RewriteEngine On 

# Варианты условий, раскомментируйте (удалите # в начале строк) у того варианта, который Вам подходит. Не подходящий же вариант нужно закомментировать (добавить # в начале строки)
# Вариант 1
RewriteCond %{ENV:HTTPS} !on

# Вариант 2
#RewriteCond %{HTTP:X-Forwarded-Proto} !https 

# Вариант 3
#RewriteCond %{HTTP:X-Forwarded-Port} !443

# Вариант 4 (на хостинге HostiMan он не работает, но может работать на VDS и иных окружениях).
#RewriteCond %{SERVER_PORT} 80

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Редирект с HTTPS на HTTP
Если же нужно сделать обратный редирект - с HTTPS на HTTP, то используется следующий код:

RewriteEngine On

# Варианты условий, раскомментируйте (удалите # в начале строк) у того варианта, который Вам подходит. Не подходящий же вариант нужно закомментировать (добавить # в начале строки)
# Вариант 1
RewriteCond %{ENV:HTTPS} =on

# Вариант 2
#RewriteCond %{HTTP:X-Forwarded-Proto} =https 

# Вариант 3 (на хостинге HostiMan он не работает, но может работать на VDS и иных окружениях).
#RewriteCond %{SERVER_PORT} 443

RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Убираем www из адреса сайта или переносим сайт с одного домена на другой
Если Ваш сайт доступен по адресам www.site.ru и site.ru, Вы можете избавиться от первого варианта, но при этом сайт будет доступен по обоим адресам. Для этого используйте правило:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

И тогда у Вас будет произведен 301 редирект с www на сайт без www. Если сайт работает по протоколу https, то вместо http напишите https.

Аналогичным образом можно сделать переадресацию с одного домена на другой: вместо www.site.ru укажите старый домен, а вместо site.ru - новый. Например:

RewriteEngine On
RewriteCond %{HTTP_HOST} old-site.ru$ [NC]
RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

Тогда все запросы на old-site.ru (включая все его поддомены) будут переадресованы на site.ru

Добавляем www к адресу сайта
Аналогичная ситуация с предыдущей, только немного наоборот

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site.ru
RewriteRule (.*) http://www.site.ru/$1 [R=301,L]

Удаляем лишний слэш / из адресной строки
Например, вместо site.ru/catalog/, будет site.ru/catalog

RewriteEngine On
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ /$1 [R=301,L]

Редирект на новую страницу
Настройте перенаправление со старой страницы /old_index.php на новую /new_index.php

Redirect 301 /index.php http://yoursite.ru/index.php

Более сложные примеры правил редиректов при помощи .htaccess

RedirectMatch [status] URL-regexp URL-to-redirect

[status- код перенаправления (30x), 
URL-regexp - информация о перенаправляемом ресурсе, в том числе, с использованием регулярных выражений
URL-to-redirect - адрес перенаправления

Пример 1. Переадресация всего сайта с сохранением строки запроса

Redirect / http://yandex.ru/yandsearch?text= 

Выполнится 302 редирект (по умолчанию) на поиск в Яндексе символов, введенных в адресную строку после названия Вашего сайта.
То есть если посетитель введет http://site.ru/page, то браузер его перенаправит на http://yandex.ru/yandsearch?text=page

Пример 2. Переадресация конкретной страницы

Redirect 301 /hello.html http://google.ru/search?q=bye

 В случае перехода на страницу http://site.ru/hello.html выполнится 301 редирект на поиск в Гугле фразы "bye".

Пример 3. Переадресация конкретных файлов.
Примечание: данный редирект может не работать на серверах с nginx, если используются расширения статических файлов. 

RedirectMatch (.*)\.jpg$ http://хостинг_для_картинок$1.jpg 

"Временно" (по умолчанию действует 302 редирект) переадресовываем все запросы jpeg-картинок на какой-либо бесплатный хостинг
Аналогичный код, но при помощи RewriteRule

RewriteEngine on
RewriteRule (.*)\.jpg$ http://хостинг_для_картинок$1.jpg [L,R]


Пример 4. Передресация URL, в которых содержится QUERY STRING
Если у Вас имеется страница https://site.ru/page.php?page=hello&id=5 и нужно сделать её редирект, то при помощи .htaccess нужно составить сложные правила, которые позволят выполнить поставленную задачу. 

RewriteCond %{REQUEST_FILENAME} page\.php$
RewriteCond %{QUERY_STRING} ^page=hello&id=5$
RewriteRule ^page\.php$ https://site.ru/redirect_to? [R=301,L]

 

В первой строке мы указываем, что правило будет распространятся только на запрос файла page.php
Во второй строке указываем строку запроса (query string), при наличии которой выполнится правило RewriteRule.
Когда 2 указанных RewriteCond совпадут, сработает RewriteRule, в котором указан редирект страницы page.php на URL https://site.ru/redirect_to? с кодом 301
Знак "?" в конце URL указан для того, чтобы строка запроса не передавалась на URL редиректа. Если передача необходима, то следует удалить знак "?" из URL.

Если у Вас возникнут трудности с настройкой данной редиректа обратиться в техническую поддержку нашего хостинга и наши сотрудники с радостью помогут Вам.