Оценок: 1
Редиректы htaccess - перенаправление URL страниц, сайта

Перенаправления (редиректы) в .htaccess

Что такое перенаправления и для чего они нужны.  Редирект - автоматическая переадресация пользователей с одной страницы сайта на другую, или другой сайт. Редирект необходим при смене адреса страницы, при смене домена, при удалении страницы, что бы не потерять ее вес. Перенаправить можно как отдельную страницу, так и весь сайт, либо его  разделы.

Есть несколько основных редиректов:

301 - Moved Permanently (перемещено навсегда)
302 - Moved Temporarily (перемещено временно)
303 - See Other (смотреть другое).

Остановимся на 301-м редиректе, как наиболее благоприятном с точки зрения ПС, означающем окончательное перемещение страницы по новому адресу. 

Редиректы в примерах будут прописываться в файле конфигурации Apache - .htaccess. Для работы перенаправлений на сервере должен быть включен модуль mod_rewrite (с этим проблем как правило нет).

1. Перенаправление одной страницы (сайта) на другую

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

RewriteRule ^page1 /page2 [R=301,L]

Таким образом можно перенаправить как отдельные страницы, так и раздел полностью. Для примера возмем категории cat1, cat2 и cat3. В первой категории есть страницы - str1, str2 и т.д. 

1.1. Если мы переместили все страницы категории cat1 в категорию cat2 (с изменением ссылок), то прописать нужно:

RewriteRule ^cat1 /cat2 [R=301,L]

1.2. Если в категорию cat2 были перемещены все страницы, кроме str3 и str5, которые были перемещены в категорию cat3, то сначала нужно перенаправить отдельные страницы, а затем всю категорию:

RewriteRule ^cat1/str3 /cat3/str3 [R=301,L]
RewriteRule ^cat1/str5 /cat3/str5 [R=301,L]
RewriteRule ^cat1 /cat2 [R=301,L]

1.3. В некоторых случаях после такой записи можно получить бесконечное перенаправление. Например вот такой случай - /cat1/sub на /cat1/sub-page

Здесь необходимо указать окончание ссылки:

RewriteRule ^cat1/sub$ /cat1/sub-page [R=301,L]

1.4. И еще вариант 301 редиректа:

Redirect 301 /cat/stranica.html /stranica2.html

2. Убираем "index.php" из урлов с перенаправлением:

RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L]

3. Перенаправление страниц без слеш, на страницы со слешем:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !.html$
RewriteRule (.+) $1/ [R=301,L]

В таком варианте слеш будет добавлен ко всем урлам, кроме тех, где есть вконце .html, или уже добавлен слеш

А вот так для всех страниц где уже есть слеш, или .html, или id с любым числом (id5465, id54444 и т.д.). Удобно использовать, если нужно закрыть слешем категории, а страницы оставить без слеша.. если в урлах страниц есть что то общее

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !.html$
RewriteCond %{REQUEST_URI} !/id([\d]+)$
RewriteRule (.+) $1/ [R=301,L]

4. Убираем часть ссылки из URL

4.1. К примеру, необходимо из ссылки "/catalog/category/product.html" убрать "catalog". Для этого пропишем в htaccess следующее правило:

RewriteRule ^catalog/(.+)$ /$1 [R=301,L]

4.2. Другой случай, если нужно убрать часть URL где то в середине. Пример, из ссылки "/catalog/subcat/item/product.html" убрать "item". Здесь прописываем следующее:

RewriteRule ^(.*)item/(.+)$ /$1$2 [R=301,L]

5. Перенаправление домена с WWW на домен без него

Для примера - домен этого сайта - замените на свой.

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^WebRazrab\.ru [NC]
RewriteRule (.*) https://webrazrab.ru/$1 [R=301,L]

6. Перенаправление домена без WWW на домен с www

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

Плюс вариант без указания самого домена:

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} (.+)$
RewriteRule ^(.*)$ https://www.%1/$1 [R=301,L] .

7. Перенаправление http на https (безопасное соединение)

Первый вариант - простое, стандартное перенаправление с проверкой порта:

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://webrazrab.ru/$1 [R=301,L]

Этот вариант работает почти всегда, но бывают случаи, когда сервер передает https на 80 порт и такая запись приводит к множественным редиректам. Для решения есть вариант проверять не порт а само наличие https:

RewriteCond %{HTTP:X-HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Проверка по HTTP_X_FORWARDED_PROTOCOL

RewriteCond %{HTTP:X-Forwarded-Protocol} !=https [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Есть два варианта данного решения, во втором нужно использовать другое значение в проверке - "1" вместо "on"

Еще один вариант - проверка по HTTP_CF_VISITOR

RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Вообще вариантов проверки на https есть много вариантов, поискать можно в phpinfo(), но бывают варианты когда любая проверка, редирект приводят к ошибке "ERR_TOO_MANY_REDIRECTS". Если ничего не помогает, попробуйте в самое начало .htaccess добавить:

SetEnvIf X-SSL-Emu on HTTPS=on

Возможно вам будет интересен вариант редиректа с помощью PHP. Написано для использования в MODX, но сам скрипт простой и подойдет для использования в других случаях (с другими CMS).

Оценок: 1

Комментарии (3)

  1. Красавец 3 год меня выручаешь!!!

    Андрей 17 апреля 2018, 15:10 0
    • Здравствуйте! Прошу дать совет и по возможности, конечно и желанию, подсказать как правильно поступить с ссылками, которые заканчиваются /.html? пример:https://pravo-wmeste.ru/ustav-garazhnogo-kooperativa-glavnyiy-dokument-ego-deyatelnosti/.html Я внимательно прочитал Вашу статью, но к сожалению, слаб в понимании кодов. Изменить файл .htaccess ещё смогу, но какой поставить код редиректа не понимаю… А может и не надо ничего делать? Благодарю!

      Владимир Николаевич 19 ноября 2017, 18:32 0
      • Добрый день! Сменить не помешает, хотя насколько это важно в Вашем случае — больше вопрос к сео. Что касается технической части, то сайт на WP, а он и сам редиректы сделает (должен сделать), главное — правильно настроить ссылки для категорий и страниц… разные варианты урлов для статей и категорий можно настроить в functions.php темы

        Владимир 21 ноября 2017, 14:40 0
      Надежный хостинг VPS серверов
      • Свои ISO образы
      • VDS с оплатой раз и навсегда
      • Аренда VDS на любой срок, с оплатой по дням
      • Большое разнообразие конфигураций
      • Дата-центры в ЕС и России
      + скидка 10%