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

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

Курсы

Правила приведены для сервера 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)


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

    Виктория

     

    Стоит плагин галереи fw galery. Эта собака делает дубли страниц вида: /klumby/galleries /klumby Мучилась долго с синтаксисом. Комбинации RewriteCond RewriteRule на joomla 3 у меня почемуто не срабатывают или может кеш сильно тупит. Помог редирект: RewriteRule ^(.*)/galleries$ /$1 [R=301,L] убирает эти поганые дубли. Может кому пригодится.

    Александр

     

    Добрый день! Подскажите, как написать регулярку, чтобы при 404 ошибке на основном домене, в запрашиваемую страницу добавлялся поддомен? Т.е. так: Человек пришел по адресу: http://sitename.ru/cat/12.php А ему подставляет http://old.sitename.ru/cat/12.php? Вот такой вариант (из статьи)
    RewriteCond %{HTTP_HOST} ^test.site.ru$ [NC]
    RewriteRule ^(.)$ http://site.ru%{REQUEST_URI site.ru%} [R=301,NC,L,QSA]
    Если перевернуть:
    RewriteCond ^(.)$ http://site.ru%{REQUEST_URI site.ru%} [R=301,NC,L,QSA]
    RewriteRule %{HTTP_HOST} ^test.site.ru$ [NC]
    Просто на старом сайте, на поддомене old очень много статей, и все переносить их – самоубийство чистой воды. А просто редирект прописывать – htaccess будет километровый. Спасибо!

    coder hol es

     

    Здравствуйте!
    Попробуйте так:
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/(.*)$ http://old.sitename.ru/$1 [R=301,L]
    или
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ http://old.sitename.ru/$1 [R=301,L]

    Natali

     

    Здравствуйте! Помогите, пожайлуста! Замучилась с GoogleWebMaster. После переделки сайта не могу настроить правильные редиректы. 1. Есть в индексе такие страницы, и их надо отправлять на 404-page http://www.aptieka.ros.lv/_aptieka.php?page=21&lang=ru&all_art=450 www.aptieka.ros.lv/_…
    Есть такие: 2. http://www.aptieka.ros.lv/?page=21&lang=lv&all_art=515 www.aptieka.ros.lv/?… нужно отдавать 301 и направлять на без www.
    Делаю 1-й вариант htaccess:
    ErrorDocument 404 /?page=page404
    В результате. 1. отдает 404 (все как надо)
    2. отдает 200 (что создаст дубль страницы!!!)
    Делаю 2-й вариант htaccess:
    ErrorDocument 404 /?page=page404 RewriteCond %{HTTP_HOST} ^www\.aptieka.ros\.lv$ [NC]
    RewriteRule ^(.*)$ http://aptieka.ros.lv/%241 aptieka.ros.lv/ [L,R=301]
    В результате. 1. отдает 301 (и гугл ругается, что страница не существует, а ответ не 404)
    2. отдает 301 (все правильно)
    Как сделать вао

    coder hol es

     

    Здравствуйте! 1. C www на без и обратно настраивается для всего сайта – смотрите материал, там это есть.
    2. От индексации закройте в роботс и посмотрите результат – можете проверить через инструменты webmastera соответствующих поисковиков.
    2.1. Также можно закрыть через регулярные и выдавать правильный header через php на необходимые страницы/маски.
    3. Пробуйте и выстраивайте логику – к сожалению, глубоко вникать и решать конкретную неявную задачу (поскольку существует множество неозвученных и возможно присутствующих нюансов в вашем случае), возможности нет. Можно обратиться за помощью на форумы или платно к специалистам – можно на тех же форумах.


 

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