Инициализирующие директивы
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 параметры)
RewriteRule ^test$ /test? [L,R=301]
- Для удаления всех GET параметров просто поставьте в URL"куда" знак вопроса
- GET не является частью %{REQUEST_URI} и не может быть выделен RewriteRule в
Удалить GET у URL с конкретными GET параметрами
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]
# То сделать перенаправление
Обратите внимание что используется % а не $