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