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)
Оставить комментарий