Рейтинг нашей компании
Пн-Пт 09:00-18:00,
Сб-Вс Выходной
Работаем по всей России!
Апдейты Яндекс
Выдача Яндекс: 22.09.2020
ИКС: 24.09.2020

Правила создания редиректа 301 в файле .htaccess. Советы и рекомендации

09 февраля 2020
Правила создания редиректа 301 в файле .htaccess. Советы и рекомендации

Данные рекомендации предназначены для использования на сервере Apache. В правилах %{QUERY_STRING} необходимо указывать URL-адреса после знака вопроса (задание значения CGI-параметра). Срабатывание правил редиректа происходит при условии попадания URL-адреса под определенное правило. О значениях разных символов, типа: ^, $, NC и других, вы можете прочитать внизу статьи.

Правила настройки файла .htaccess для редиректа лучше размещать сразу после этих строк:

Options +FollowSymLinks

RewriteEngine On

 

Комментарии лучше всего обозначать символом # вначале текста

# Текстовый комментарий, данная строчка не будет обрабатываться.

 

301-редирект с домена без WWW на домен с WWW префиксом #

RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]

RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

 

С домена с WWW префиксом на без #

RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC]

RewriteRule ^(.*)$ http://site.ru/$1 [R=301,L]

Для версии https:

RewriteCond %{SERVER_PORT} ^80$ [OR]

RewriteCond %{HTTP} =on

RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Переадресация с одной статической страницы на другую #

Redirect 301 /was.php http://www.site.ru/new.php

В этом случае необходимо новый адрес указывать полностью с http и доменным именем.

В некоторых случаях следует использовать переадресацию через RewriteRule #

RewriteRule ^dir /dir-new/$1 [R=301,L]

301-редирект для страницы с GET параметрами #

Если адрес страницы имеет следующий вид: http://www.site.ru/dir/index.php?IBLOCK_ID=1&SECTION_ID=111, тогда настройка редиректа 301 выполняется следующим образом:

RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=111$ [NC]

RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]

Если в адресе некоторые GET параметры не заданы (в первом случае, это SECTION_ID), тогда мы рекомендуем использовать следующий код:

RewriteCond %{QUERY_STRING} ^IBLOCK_ID=1&SECTION_ID=(.*)$ [NC]

RewriteRule ^dir/index\.php$ /new/sef/? [R=301,L]

301-редирект со страницы без заданного параметра в корень #

Если адрес имеет следующий вид: http://www.site.ru/?abc то для перенаправления подойдет последовательность строчек:

RewriteCond %{QUERY_STRING} ^abc$ [NC]

RewriteRule ^$ /? [R=301,L]

301-редирект для конкретного файла, а не целой папки #

Если требуется настроить переадресацию только для адреса http://www.site.ru/dir/, но при этом чтобы страница http://www.site.ru/dir/index.php?IBLOCK_ID=1 открывалась по старому адресу, необходимо использовать спецсимвол $ в правиле.

RewriteRule ^dir/$ http://www.site.ru/new-dir/ [R=301,L]

Как быть с доменами в зоне РФ? #

Для доменов в зоне РФ действуют все те же правила, но только все кириллические символы необходимо заменить на альтернативный код (он на латинице). В частности, сама зона .рф преобразуется в .xn--p1ai.

301-редирект с домена на домен #

RewriteCond %{HTTP_HOST} ^old-site\.ru$ [NC]

RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

И для домена в зоне РФ:

RewriteCond %{HTTP_HOST} ^xn-...\.xn--p1ai$ [NC]

RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]

Настройка переадресации на папки со слешем в конце / #

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_URI} !\..{1,10}$

RewriteCond %{REQUEST_URI} !(.*)/$

RewriteRule ^(.*)$ http://www.site.ru/$1/ [L,R=301]

Настройка переадресации на папки без слеша (убираем слеш в конце) #

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} ^(.+)/$

RewriteRule ^(.+)/$ http://www.site.ru/$1 [R=301,L]

301-редирект с домена на папку на другом домене #

RewriteCond %{HTTP_HOST} ^si-te\.ru$ [NC]

RewriteRule ^(.*)$ http://www.site.ru/si-te/ [R=301,L]

Редирект со всех файлов домена, кроме папки администратора bitrix #

RewriteRule ^bitrix/ /bitrix/admin/ [L,R=301]

RewriteRule ^(.*)$ http://www.newsite.ru/new/ [L,R=301]

Редирект всех файлов в папке на заданный файл #

RewriteRule ^dir(.*)$ /new-file.php [L,R=301]

Редирект файлов из заданной папки кроме, определенного файла #

RewriteRule ^dir/no-file.html /no-file-new.html [L,R=301]

RewriteRule ^dir(.*)$ /all.php [L,R=301]

Смена страниц с html расширения на php расширение #

RedirectMatch 301 (.*)\.html$ http://www.new-site.ru$1.php

Перенос картинок / изображений из папки /img/ на поддомен #

RewriteRule ^img/(.+)\.jpg$ http://img.domain.ru/$1.jpg [R=301,L]

Задание типа индексной страницы (php, html, htm и другие) #

Указывается порядок загрузки типов индексного файла, лежащих в корне каталога.

DirectoryIndex index.html index.php index.htm index.shtml

Редирект с индексной страницы php на саму папку (корень) #

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/

RewriteRule ^index\.php$ http://www.site.ru/ [R=301,L]

Для всех индексных страниц на сайте:

RewriteRule ^(.*)index\.php$ http://www.site.ru/$1 [R=301,L]

Редирект с поддомена на основной домен второго уровня #

RewriteCond %{HTTP_HOST} ^test.site.ru$ [NC]

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

Редирект для заданного файла в различных директориях (папках) #

RewriteRule [^abc]/unique-file.html /unique-file.html [R=301,L]

Код позволяет поставить 301-редирект со всех папок вида http://site.ru/***/uniqe-file.html на один файл в корне /unique-file.html. Бывает полезен при переделке сайта и изменении ссылок.

Если требуется создать ЧПУ-копию какой-либо динамической страницы, то это можно также реализовать с помощью .htaccess. #

RewriteRule ^testovyi/test/?$ /studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]

Код позволяет создать копию страницы с относительным адресом /studio/news/detail.php?ID=230354&PAGEN_2=11 по адресу /testovyi/test/

301-редирект с HTTPS-версии на HTTP #

RewriteCond %{HTTPS} "on"

RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,QSA]

Позволяет устранить наличие дублей URL с HTTPS в индексе поисковых систем.

Перенос сайта на версию с HTTPS (для всех страниц) #

RewriteCond %{SERVER_PORT} ^80$ [OR]

RewriteCond %{HTTP} =on

RewriteRule ^(.*)$ https://domain.ru/$1 [R=301,L]

Настройка 403 кода ответа сервера для реф-спама (301-редирект для спама по REFERER) для списка ресурсов #

RewriteCond %{HTTP_REFERER} ref-spam-site.ru [NC,OR]

RewriteCond %{HTTP_REFERER} another-ref-spam.ru [NC]

RewriteRule .* - [F]

Настройка позволяет отклонить спамный реферальный трафик с ряда ресурсов по заголовку HTTP_REFERER.

Указание пути к файлу 404 ошибки с помощью .htaccess #

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

ErrorDocument 404 /404-for-me.php

! Все правила выполняются в прямом порядке их следования в файле .htaccess и правило, написанное позже, и будет выполняться позже.

! Для сайтов, на которых используется не сервер Apache, аналогичные 301-редиректы легко настраиваются с помощью PHP.

<?php

header("HTTP/1.1 301 Moved Permanently");

header("Location: http://www.site.ru/dir/");

exit();

?>

! Оптимально настраивать все редиректы сразу на конечную страницу (без промежуточных перенаправлений, в один шаг) это улучшает их восприятие со стороны поисковых систем и пользователей.

 

Если требуется настроить редирект только для некоторых USER_AGENT'ов, а не для всех пользователей #

RewriteCond %{HTTP_USER_AGENT} (iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|j2me|symbian|series\ 60|symbos|windows\ mobile|windows\ ce|ppc|smartphone|blackberry|mtk|bada|windows\ phone) [NC]

RewriteRule (.*) http://mobile.site.ru/ [L,R=301]

Если требуется настроить редирект для всех поисковых роботов (представлен список их USER_AGENT'ов) #

RewriteCond %{HTTP_USER_AGENT} !(accoona|ia_archiver|antabot|ask\ jeeves|baidu|dcpbot |eltaindexer|feedfetcher|gamespy|gigabot|googlebot |gsa-crawler|grub-client|gulper|slurp|mihalism|msnbot|worldindexer |ooyyo|pagebull|scooter|w3c_validator|jigsaw|webalta|yahoofeedseeker |yahoo!\ slurp|mmcrawler|yandexbot|yandeximages |yandexvideo|yandexmedia|yandexblogs|yandexaddurl|yandexfavicons |yandexdirect|yandexmetrika|yandexcatalog|yandexnews |yandeximageresizer) [NC]

RewriteRule (.*) http://no-search.site.ru/ [L,R=301]

Несколько простых примеров #

Переадресация с www.site.ru/component/content/?view=featured на www.site.ru/

RewriteCond %{QUERY_STRING} ^view=featured$ [NC]

RewriteRule ^component/content/$ /? [R=301,L]

Переадресация с www.site.ru/index.php?idc=4&marea=6 на www.site.ru/

RewriteCond %{QUERY_STRING} ^idc=4&marea=6$ [NC]

RewriteRule ^index\.php$ /? [R=301,L]

Синтаксис для регулярных выражений #

. — Точка заменяет произвольный символ.

[abc] — обозначает перечень символов, совпадающих с буквами a, b, или с.

[^abc] — перечень символов, которые не входят в указанных диапазон. Совпадёт с любым символом, кроме a, b, или с.

* — означает, что предшествующий символ может повторяться (0 или более раз).

[abc]* — команда найдёт идущие подряд символы из заданного набора.

[^abc]* — с точностью до наоборот.

 

.* — заменяет абсолютно любой набор символов. ".*" — найдёт все подстроки между кавычками.

^ — начало строки (в том случае, если используется в начале выражения).

$ — обозначает конец строки.

 

\w — буква, цифра или подчёркивание _.

\d — заменяет любую цифру.

\D — заменяет любой символ, но не цифру.

[0-9] — заменяет любую цифру.

[a-z] — любая буква от a до z (весь латинский набор символов) в нижнем регистре.

[A-Z] — любая буква от A до Z в ВЕРХНЕМ регистре.

[a-zA-Z] — любая буква от a до Z в любом регистре.

[a-Z] — то же самое.

Убираем все GET-параметры после знака вопроса (?) #

RewriteRule (.*) $1? [R=301,L]

Располагать после: RewriteBase /

ПАМЯТКА ПО ИСПОЛЬЗУЕМЫМ СИМВОЛАМ И ОБОЗНАЧЕНИЯМ

Строчка RewriteCond — условие выполнения правила RewriteRule. Если условие выполняется, то срабатывает редирект. Правила могут задаваться с помощью регулярных выражений.

 

Спецсимволы, используемые в правилах и их значения.

 

^ — спецсимвол начала строки;

$ — спецсимвол конца строки;

! — спецсимвол отрицания;

. — точка, заменяет любой символ, но только один;

() — группировка;

\ — «экранирующий» слеш, следующий символ после него считается обычным, а не спецсимволом;

# — начало текстового комментария в файле.

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

 

? — символ повторяется 0 или 1 раз.

+ — повторяется от 1 до 65536 раз.

* — повторяется от 0 до 65536 раз.

Флаги, задают доп. опции для используемого правила. Перечисляются в квадратных скобках через запятую, скажем [NC] или [R=301,L].

 

NC — флаг NoCase, отключающий проверку регистра символов при срабатывании правила.

R — флаг Redirect, производит процесс остановки изменения URL-адреса и возвращает результат. Чаще всего используется значение R=301, но возможны и другие для временных перенаправлений (302, MOVED TEMPORARY).

L — флаг Last, останавливает формирования URL-адреса и строка считается окончательной.

 

Об авторе

Зуйков Юрий ведущий программист

Зуйков Юрий

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