301 редирект сниппеты для .htaccess
Для большинства проектов нашей студии приходится использовать SEO редиректы, поскольку движки сайтов не в состояние учесть некоторые моменты, или же требуется действительно исправить существующую ситуацию с урлами.
Как показала практика даже программисты плохо понимают суть работы 301 редиректа, по сему пришлось написать стандартны снипет для .htaccess
Я только вкратце опишу их, поскольку описал каждую строчку кода. Задача которые решает данный сниппет достаточно простые, но они собраны и отдебажены по мере возможности.
Данный конфиг позволяет решить следующие задачи:
- Активация канонических директив
 - Активация рекомендованных директив «Битрикс монитор качества»
 - Установить основное зеркало сайта с www сохраняя протокол http или https
 - Установка основного зеркала сайта без www сохраняя http или https
 - Перенаправление HTTP > HTTPS
 - ПеренаправлениеHTTPS > HTTP
 - Удалить любое количество «/» стоящих рядом; site.ru////catalog//item > site.ru/catalog/item
 - Удалять «/» в конце URL если это файл
 - Добавлять «/» в конце URL если его там нет и это не файл. (работает в связке с вышестоящим, иногда требуется одно, иногда другое)
 - Удалить из URL index.php
 - И многое другое...
 
Инициализирующие директивы
RewriteEngine On # Директива включает редиректы !!!! RewriteBase / # Без директивы "(.*) = /$1" будет /var/wwww/site/web/$1 с директивой = /$1 Options +FollowSymLinks # Разрешает переход по символическим ссылкам.
Перенаправляем протокол https на http
RewriteCond %{HTTPS} on 
   # Проверяем наличие https в URL. 
RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI} 
   # Перенаправляем протокол на http.
Перенаправляем протокол http на https
RewriteCond %{HTTPS} off
   # Проверяем наличие https в URL.
RewriteCond %{REQUEST_URI} !^/bitrix/admin/1c_exchange\.php$ [NC] 
   #  Исключим обмен с 1С, ему требуется только 200 (только для Bitrix) 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.
Удалить www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
   # Проверяем, содержит ли домен www (в начале URL).
RewriteRule ^(.*)$ https://%1/$1 [R=301,L] 
   # Перенаправляем URL на домен без www.
Удалить 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
Добавить www
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC] 
   # Проверяем, не содержит ли домен www (в начале URL). 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L] 
   # Перенаправляем URL на домен c www.Убираем повторяющиеся слеши (/) в URL
Добавить 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 если он включен.
Убираем 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.
Удалить повторяющиеся слеши в URL если их блольше чем 1
RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
  # Убедимся что это не урл в  GET
RewriteRule .* /$0 [R=301,L]
   # Исключаем все лишние слеши.
Убираем слеши в конце 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 ^(.*)$ https://klondike-studio.ru/  [R=301,L]
Перенаправляет все URL со старого домена и всех под доменов на главную страницу нового!
RewriteCond %{HTTP_HOST} ^(.*)olddomain\.ru$ [NC] 
   # Проверяем является ли оканчивается ли домен на olddomain.ru 
RewriteRule ^(.*)$ http://newdomain.ru [R=301,L] 
   # перенаправляет все урлы на главную
Перенаправляет все содержимое каталогов
http://site.ru/dir1/любое/любое --> http://site.ru/dir2/любое/любое
RewriteCond %{REQUEST_URI} ^/dir1/(.*)$ 
   # если строка начинается с /dir1/ 
RewriteRule ^(.*)$ /dir1%1 [R=301,L] 
   #Перенаправить все URL с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
Перенаправляет все содержимое каталогов с любым началом и концом
http://site.ru/любое/dir1/любое/любое --> http://site.ru/любое/dir2/любое/любое
RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$ 
   # если строка содержит /dir1/ 
RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L] 
   #Перенаправить все URL с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
Удалить все что после знака вопроса в URL (Удалить GET параметры)
http://site.ru/test?faq=20&id=5 --> http://site.ru/test
RewriteRule ^test$ /test? [L,R=301]
Удалить GET у URL с конкретными GET параметрами
http://site.ru/?lang=en&date=21.01.21 --> http://site.ru/
RewriteCond %{QUERY_STRING} (^|&)lang\=en($|&)
# конкретный GET параметр lang=en
RewriteCond %{QUERY_STRING} (^|&)date\=.+($|&)
# GET параметр date= не пустая
RewriteRule ^(.*)$ /%1? [L,R=301]
# Удалить все GET
Редирект сработает если находится в диапазоне цифр 99-120
http://site.ru/65 --> http://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]
   # То сделать перенаправление
Обратите внимание что используется % а не $
Оставить комментарий
Комментарии (162)
Оставить комментарий