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

Дата публикации  Дата изменения05.10.21  Комментарии76   Просмотры115581

Курсы

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

Ниже даны наиболее используемые правила настройки файла .htaccess для 301 редиректа. Лучше размещать все правила после двух строк:

Options +FollowSymLinks
RewriteEngine On
  • 301 редирект с домена без WWW на домен с WWW префиксом #
RewriteCond %{HTTP_HOST} ^site\.ru$ [NC]
RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L]
  • Для HTTPS-версии #
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://your-site.com/$1 [R=301,L]
  • С домена с WWW префиксом на без #
RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC]
RewriteRule ^(.*)$ http://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]
или так, на корень:
RewriteRule ^/?dir/(.*)$ /$1 [R=301,L]
  • 301 редирект для страницы с GET параметрами #

При модернизации динамического сайта и создании ЧПУ-адресов часто возникает необходимость перенаправить старые страницы с параметрами ID на новые с ЧПУ. Например, чтобы переадресовать страницу вида http://site.com/page.php?id=12 на новую страницу http://site.com/newname.html, используется следующая конструкция:

RewriteCond %{QUERY_STRING} ^id=12$
RewriteRule ^/page.php$ http://site.com/newname.html [L,R=301]

Скажем, адрес страницы имеет вид: 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/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
  • Задание типа индексной страницы (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.ruuniqe-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
  • Редирект всех поддоменов на главное зеркало #
RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.site\.com$ 
RewriteRule ^(.*) http://site.com/$1 [R=301,L]
  • Редирект всех поддоменов, кроме одного, на главное зеркало #
RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.site\.com$ 
RewriteCond %{HTTP_HOST} !=one.site.com [NC]
RewriteRule ^(.*) http://site.com/$1 [R=301,L]
! Все правила выполняются в прямом порядке их следования в файле .htaccess и правило, написанное позже, и будет выполняться позже.
! Для сайтов, на которых используется не сервер Apache, аналогичные 301 редиректы легко настраиваются с помощью PHP:
<?php
header_301("HTTP/1.1 301 Moved Permanently");
header_301("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-адреса и строка считается окончательной.

Полезные ссылки:

UPD:

  • Переадресация на HTTPS #
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

обратно:

RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://your_site.com/$1 [R=301,L]

⇥ Для WordPress:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
 
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
</IfModule>
# END WordPress

  • Варианты переадресации на HTTPS #
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' 
RewriteRule ^(.*)$ https://www.domain.com/$1 [L]
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Protocol} !=https 
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

Можно также настроить 301 редирект через .htaccess только для одной страницы. В примерах приведено название testpage.php, его замените на адрес нужной страницы. Используйте только один из приведенных вариантов:

RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} =/testpage.php
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI) [R,L]
RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_URI} =/testpage.php
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI> [QSA,L]

*Примечание:

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

Если сайт работает на Битрикс, исправьте абсолютные ссылки на относительные, затем обновите файлы sitemap.xls и robots.txt и внесите исправленную информацию в Яндекс.Вебмастер и Google Search Console. Настройте интеграцию с через протокол http, чтобы не пришлось переписывать всю программу. Проверьте правильность работы переадресации через онлайн-инструменты (например, Redirect Checker)

Если все ссылки с http без ошибок ведут на https, установку SSL-сертификата можно считать завершенной.


 Источник     Источник 

Бесплатные курсы

Категории

Теги: , , , , , , , , , , ,

Оцените материал:

Рейтинг: 9.8/10 (16)


КомментарииКомментарии:

    Елена

     

    Здравствуйте, спасибо за статью. Я попробовала сделать редирект с главной страницы с именем мойсайт/home на мойсайт, но что-то не получилось, то есть я кликаю в меню главная и высвечивается мойсайт/home, а кликаю на название в шапке и окрывается мойсайт. В файла .htaccess я прописала так RewriteEngine On RewriteRule ^http://мойсайт.ru/home /http://мойсайт.ru [R=301,L] Возможно у меня где-то ошибка, буду благодарна за помощь. Спасибо, Елена

    coder.hol.es /* Админ */

     

    Здравствуйте, пожалуйста) Попробуйте так:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^home /$1 [R=301,L]
    </IfModule>

    Алексей

     

    Подскажите пожалуйста как правильнее настроить 301 внутренний редирект.
    старый http://site.biz/page.php – новый http://site.biz/page/
    старый http://site.biz/page.php?group_id=1… – новый http://site.biz/cat/name-page/
    На данный момент стоит вот такая конструкция
    RewriteEngine On
    RewriteRule ^(.)page.php$ http://site.biz/page/ [R=301,L]
    RewriteRule ^(.)page.php?group_id=1$ http://site.biz/cat/name-page/ [R=301,L]

    coder.hol.es /* Админ */

     

    Вроде правильно. Если работает так, как нужно.

    Петр

     

    Здравствуйте Помогите правильно перенаправиться. Вообшем мне надо перенапавить все, что со слешем вконеце, на теже страницы, но уже без слеша (в конце). Вот ваше решение:
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} ^(.)/$
    RewriteRule ^(.
    )/$ http://www.site.ru/%241" [R=301,L]
    Все хорошо, но!.. Админка сайта работает только со слешами в конце, если применить для всего сайта это правило, то и для админки оно сработает, и, соответственно, админка перестает работать нармасьно. Админка находится по адресу: http://мой.сайт/admin/ Потому ВОПРОС: Как применить это правило, но сделать так, чтобы админка работала? Спасибо!


 

Старые →← Новые