СправошнаяПоиск

Сниппеты для htaccess — редиректы

Инициализирующие директивы

 

RewriteEngine On
   #  Директива включает редиректы !!!!
RewriteBase /
   # Без директивы "(.*) = /$1" будет /var/wwww/site/web/$1  с директивой  = /$1
Options +FollowSymLinks
   # Разрешает переход по символическим ссылкам.
  • Инициализация редиректов нужна 1 раз в файле но в самом верху

Перенаправляем протокол https на http

 

RewriteCond %{HTTPS} on
   # Проверяем наличие https в URL.
RewriteRule ^.*$ %{SERVER_NAME}%{REQUEST_URI}
   # Перенаправляем протокол на http.
  • Редирект не сработает если у вас нет доверительного "зеленого сертификата", это физически не возможно!
  • Протокол http устарел, нужно переходить на https
  • Вставить код в начале .htaccess до ЧПУ
  • Используйте или Letsencrypt или платный сертификат, не используйте само подписанные сертификаты.
  • В зависимости от конфигурации веб сервера этот редирект может не сработать, причина в определения включен ли сейчас https, данный редирект может быть написан множеством способов, просто подберите тот который будет работать конкретно у вас.

Перенаправляем протокол http на https

 

RewriteCond %{HTTPS} off
   # Проверяем наличие https в URL.
RewriteCond %{REQUEST_URI} !^/bitrix/admin/1c_exchange\.php$ [NC]
   #  Исключим обмен с 1С, ему требуется только 200 (только для Bitrix)
RewriteRule ^(.*)$ %{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.
  • Вставить код в начале .htaccess до ЧПУ
  • Используйте или Letsencrypt или платный сертификат, не используйте самоподписанные сертификаты.
  • В зависимости от конфигурации веб сервера этот редирект может не сработать, причина в определения включен ли сейчас https, данный редирект может быть написан множеством способов, просто подберите тот который будет работать конкретно у вас.

Удалить www

 

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
   # Проверяем, содержит ли домен www (в начале URL).
RewriteRule ^(.*)$ %1/$1 [R=301,L]
   # Перенаправляем URL на домен без www.
  • Основное зеркало сайта должнго быть именнно то что сейчас находится в индексе поисковиков!
  • Вставить в .htaccess до ЧПУ
  • Протокол "куда" перенаправляется сайт, протокол выставлен статически и не изменяется в завиимости от ссылки по которой переходит клиент, всегда будет подставляться https
  • Протокол "куда" должен совпадать с протоколом "куда" в редиректе https, в противном случае возможны зацикливания между этими правилами.

Удалить www сохраняя протокол входящей ссылки:

 

RewriteCond %{ENV:HTTPS} on
    #Если включен https
RewriteRule .* - [E=SSL:s]
    #То создаем переменную  ssl с текстом s
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    # Проверяем, содержит ли домен www в начале URL.
RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L]
    # Перенаправляем удаляем www
  • Основное зеркало сайта должнго быть именнно то что сейчас находится в индексе поисковиков!
  • Вставить в .htaccess до https, до ЧПУ
  • Может войти в конфликт с редиректом всего сайта на https, используется когда зеркала http и https не склеены

Добавить www

 

RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
   # Проверяем, не содержит ли домен www (в начале URL).
RewriteRule ^(.*)$ www.%{HTTP_HOST}/$1 [R=301,L]
   # Перенаправляем URL на домен c www.Убираем повторяющиеся слеши (/) в URL
  • Основное зеркало сайта должнго быть именнно то что сейчас находится в индексе поисковиков!
  • Вставить в .htaccess после https но до ЧПУ
  • Протокол "куда" перенаправляется сайт, протокол выставлен статически и не изменяется в завиимости от ссылки по которой переходит клиент, всегда будет подставляться https
  • Протокол "куда" должен совпадать с протоколом "куда" в редиректе https, в противном случае возможны зацикливания между этими правилами.

Добавить www сохраняя протокол входящей ссылки

 

RewriteCond %{ENV:HTTPS} on
    #Если включен https
RewriteRule .* - [E=SSL:s]
    #То создаем переменную  ssl с текстом s
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
    # Если нет www в начале домена
RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]
    #Подставляем www и https если он включен.
  • Основное зеркало сайта должнго быть именнно то что сейчас находится в индексе поисковиков!
  • Вставить в .htaccess до https но до ЧПУ
  • Может войти в конфликт с редиректом всего сайта на https, используется когда зеркала http и https не склеены

Убираем index.php, если он есть в конце URL

 

RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
   # URL cодержит index.php в конце.
RewriteCond %{REQUEST_METHOD} =GET
   # Выявляем GET запрос в URL (не POST).
RewriteRule ^(.*)$ %1/ [R=301,L]
   # Удалить index.php из URL.
  • Вставить в .htaccess до ЧПУ
  • На некоторых сайтах нужно удалить строку RewriteCond %{REQUEST_METHOD} =GET

Удалить повторяющиеся слеши в URL если их блольше чем 1

 

RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
  # Убедимся что это не урл в  GET
RewriteRule .* /$0 [R=301,L]
   # Исключаем все лишние слеши.
  • Вставить в .htaccess до ЧПУ

Убираем слеши в конце URL для статических файлов (содержит точку)

 

RewriteCond %{REQUEST_URI} \..+$
   # Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
   # И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
   # Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
   # И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
   # Исключить слеш.
  • Целесообразно объеденить с добавлением слеша, с точки зрения синтаксиса нужно и то и другое сразу, поскольку в случаях если это это файлы то слеш в конце это ошибка, если же это директория или виртуальная директория то наоборот нужно добавить слеш, по этому эти два правила используются вместе.
  • Расположено до добавления слша

Добавляем слеш(/), если его нет, и это не файл

 

RewriteCond %{REQUEST_URI} !(.*)/$
   # Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
   # Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
   # В URL нет точки (файл).
RewriteCond %{REQUEST_URI} ^(.+)$
 # В URL есть хоть один символы
RewriteRule ^(.*)$ $1/ [L,R=301]
   # Добавляем слеш в конце.
  • Целесообразно объедение правилом удаления слеша, с точки зрения синтаксиса нужно и то и другое сразу, поскольку в случаях если это это файлы то слеш в конце это ошибка, если же это директория или виртуальная директория то наоборот нужно добавить слеш, по этому эти два правила используются вместе.
  • Расположено после добавления слша

Все битые картинки на дефолтную

 

RewriteCond %{REQUEST_FILENAME} robots.txt
RewriteCond %{REQUEST_FILENAME} !-f
# Если этого файла нет
RewriteRule .*.(gif|jpg|png|ico)$ - [F,L,NC]
# Выделяем какие типы файлов
RewriteRule ^images/.*\.jpg$ /images/default.jpg [L]
# то перенаправить его на дефолтную

 

Перенаправление robots.txt на robot.php

 

RewriteCond %{REQUEST_FILENAME} robots.txt
   # если  файл robots.txt
RewriteCond %{DOCUMENT_ROOT}/robots.php -f
   #robots.php  существует
RewriteRule ^(.*)$ /robots.php [L]
   # То перенаправить на php файл.

 

Перенаправление sitemap.xml на sitemap.php

По факту то-же самое что и выше, но другой вариант записи.

 

RewriteRule ^sitemap\.xml$ sitemap\.php [L]

 

Редирект нескольких доменов, с www и без них на один сайт

 

RewriteCond %{HTTP_HOST} ^(www\.|)9918474\.ru$     [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)site4top\.ru$    [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)sunnyfruits\.ru$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)u-kit\.ru$       [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)mediagrup\.ru$   [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)vmast\.ru$       [NC,OR]
RewriteCond %{HTTP_HOST} ^(www\.|)desid\.ru$       [NC]
RewriteRule ^(.*)$ klondike-studio.ru  [R=301,L]
  • В последнем шаблоне OR не требуется

Перенаправляет все URL со старого домена и всех под доменов на главную страницу нового!

 

RewriteCond %{HTTP_HOST} ^(.*)olddomain\.ru$ [NC]
   # Проверяем является ли оканчивается ли домен на olddomain.ru
RewriteRule ^(.*)$ newdomain.ru [R=301,L]
   # перенаправляет все урлы на главную

 

Перенаправляет все содержимое каталогов

 

RewriteCond %{REQUEST_URI} ^/dir1/(.*)$
   # если строка начинается с /dir1/
RewriteRule ^(.*)$ /dir1%1 [R=301,L]
   #Перенаправить все URL с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL

 

Перенаправляет все содержимое каталогов с любым началом и концом

 

RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$
   # если строка содержит /dir1/
RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L]
   #Перенаправить все URL с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL

 

Удалить все что после знака вопроса в URL (Удалить GET параметры)

site.ru/test --> site.ru/test

 

RewriteRule ^test$ /test? [L,R=301]
  • Для удаления всех GET параметров просто поставьте в URL"куда" знак вопроса
  • GET не является частью %{REQUEST_URI} и не может быть выделен RewriteRule в

Удалить GET у URL с конкретными GET параметрами

site.ru --> site.ru

 

RewriteCond %{QUERY_STRING} (^|&)lang\=en($|&)
# конкретный GET параметр lang=en
RewriteCond %{QUERY_STRING} (^|&)date\=.+($|&)
# GET параметр date= не пустая
RewriteRule ^(.*)$ /%1? [L,R=301]
# Удалить все GET
  • Для удаления всех GET параметров просто поставьте в URL"куда" знак вопроса
  • GET не является частью %{REQUEST_URI} и не может быть выделен RewriteRule в
  • (^|&).....($|&) нужен поскольку первый GET параметр начинается с ? а далее &, не обязательно использовать если у вас жесткая последовательность параметров.

Редирект сработает если находится в диапазоне цифр 99-120

site.ru/65 --> site.ru/tovar-65

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

 

RewriteCond %{REQUEST_URI} ([0-9]{1,}) [NC]
RewriteCond %1 >99
   # у URL цифра больше 99
RewriteCond %1 <120
   # у URLцифра меньше 120
RewriteRule ^(.*)$ tovar-%1 [R=301,L]
   # То сделать перенаправление

 

Обратите внимание что используется % а не $