301 редирект сниппеты для .htaccess

301 редирект сниппеты для .htaccess

Для большинства проектов нашей студии приходится использовать SEO редиректы, поскольку движки сайтов не в состояние учесть некоторые моменты, или же требуется действительно исправить существующую ситуацию с урлами.

Как показала практика даже программисты плохо понимают суть работы 301 редиректа, по сему пришлось написать стандартны снипет для .htaccess

Я только вкратце опишу их, поскольку описал каждую строчку кода. Задача которые решает данный сниппет достаточно простые, но они собраны и отдебажены по мере возможности.

Активация канонических директив
  • Установить основное зеркало сайта с www или без него
  • Удалить любое количество "/" стоящих рядом до 1 ("///" → "/")
  • Удалять "/" в конце URL если это файл
  • Добавлять "/" в конце URL если его там нет и это не файл
  • Удалить из URL index.php
Последовательность установки
  • Вставить код в начале .htaccess
  • При вставке требуется указать правильное зеркало сайта, раскоментировав нужное
  • Удалить старый redirect перенаправление на основное зеркало.
  • Проверить все новые redirect(ы) на правильную работу в условиях данного проекта.
Стандартные директивы
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.
Удалить www
# 1. Редирект с www на без www. (раскоментировать директивы пункта 1) 
# RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
# Проверяем, содержит ли домен www (в начале URL).
# RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 
# Перенаправляем URL на домен без www.
Добавить www
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC] 
# Проверяем, не содержит ли домен www (в начале URL). 
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] 
# Перенаправляем URL на домен c www.Убираем повторяющиеся слеши (/) в URL
Удалить повторяющиеся слеши в URL если их блольше чем 1
RewriteCond %{THE_REQUEST} //
# Проверяем, повторяется ли слеш (//) более двух раз.
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 нет точки (файл). 
RewriteRule ^(.*)$ $1/ [L,R=301] 
# Добавляем слеш в конце.
Убираем index.php, если он есть в конце URL
RewriteCond %{REQUEST_METHOD} =GET 
# Выявляем GET запрос в URL (не POST). 
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$ 
# URL cодержит index.php в конце. 
RewriteRule ^(.*)$ %1/ [R=301,L] # Удалить index.php из URL.
Перенаправляет все содержимое каталогов http://site.ru/dir1/любое/любое → в http://site.ru/ dir2 /любое/любое .
 RewriteCond %{REQUEST_URI} ^/dir1/(.*)$ 
# если строка начинается с /dir1/ 
RewriteRule ^(.*)$ /dir1%1 [R=301,L] 
#Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
Перенаправляет все содержимое каталогов/любое/dir1/любое/любое → в /любое/dir2/любое/любое
RewriteCond %{REQUEST_URI} ^(.*)/dir1/(.*)$ 
# если строка содержит /dir1/ 
RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L] 
#Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
Редирект диапазона цифр например n99-n120

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

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

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

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

Постарался описать каждую строчку, так же файл можно скачать целиком.

Комментарии (25)

  1. Юлия 10.04.2017 Ответить
    Подскажите, как исправить редиректом такую ссылку altstream.com.ua/%2F/ ?
    должно перенаправлять на altstream.com.ua
  2. Дмитрий
    Дмитрий 11.04.2017 Ответить
    Добрый день, Юлия!

    Для начала нужно в .htaccess подключить RewriteEngine, затем указать базу для редиректа и сам редирект

    RewriteEngine on
    RewriteBase /
    RewriteRule ^%2F/$ /? [L,R=301]
  3. Виктор
    Виктор 25.05.2017 Ответить
    RewriteCond %{HTTP_HOST} ^(.*)\.$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

    Ну вообще это кстати правильноенаписание домена ибо это нулевая зона .
    Сайт всегда доступен по такому урлу, но их не индексируют поисковые роботы.
  4. Виктор 27.11.2017 Ответить
    Точка в урле это совершенно нормальное явление, так полностью пишется домен.
    Что вас в ней смущяет?
    если у вас каким-то образом проиндексировалось зеркало то просто сделайте редирект ну или

    RewriteCond %{HTTP_HOST} ^site\.ru\.$ [NC]
    RewriteRule ^(.*)$ http://site.ru$1[R=301,L]
  5. Павел 25.05.2017 Ответить
    Подскажите, как убрать из URL лишний фрагмент, который остался после плагина локализации.
    Сейчас так: http://www.site.com/ru/page.html
    Нужно так: http://www.site.com/page.html

    как правильно написать редирект в htaccess ?

    Спасибо.
  6. Виктор 01.08.2017 Ответить
    RewriteCond %{REQUEST_URI} ^(.*)/ru/(.*)$
    # если строка содержит /ru/
    RewriteRule ^(.*)$ %1/%2 [R=301,L]
    #Перенаправить все урлы с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
  7. Лина 01.11.2017 Ответить
    Добрый день!
    Как отредиректить все ссылки которые заканчиваются на цифры
    site.ru/catalog/catalog2/2225/
    на site.ru/catalog/catalog2
  8. Виктор 27.11.2017 Ответить
    RewriteRule ^catalog/catalog2/([0-9]*)/$ http://site.ru/catalog/catalog2/ [L,R=301]
    На самом деле лучше использовать вот такую регулярку
    RewriteRule ^catalog/catalog2/([0-9]{1,})/$ http://site.ru/catalog/catalog2/ [L,R=301]
    В твоем случае это всего лишь
    /catalog/catalog2/3tekst
    /catalog/catalog2/5
    /catalog/catalog2/5stranista/index.html
    и так далее
    Если же нужны только цифры то перечисление [0-9] Повторить от 1 раз и и более {1,}
  9. Дмитрий
    Дмитрий 07.11.2017 Ответить
    Само собой, они должны быть в блоке RewriteModule и содержать RewriteEngine on, RewriteBase / и Options +FollowSymLinks
  10. Максим 12.11.2017 Ответить
    Здравствуйте. Файлы сайта находятся в папке http://site.ru/pages/app/ - я хочу скрыть директорию pages/ т.е. чтобы было http://site.ru/app/
    При пере направлении:
    RewriteCond %{REQUEST_URI} ^(.*)/pages/(.*)$
    RewriteRule ^(.*)$ %1/%2 [R=301,L]
    Показывается Error 404 (оно и понятно), нужно указать где лежат файлы. Но как?
  11. Виктор
    Виктор 27.11.2017 Ответить
    Вам нужно не это
    правильно ли я понимаю что весь сайт находится на http://site.ru/pages/app/
    если да то вам нужно не редирект сделать
    вам нужно изменить DocumentRoot - он настраивается не в .htaccess А в virtualhost
  12. Alexey 26.01.2018 Ответить
    Приветствую, как оптимизировать 301 редирект, чтобы не писать 3 строки под каждый язык? а одной строкой

    Redirect 301 /ru/category-name-ru/3244-tovar-name-1.html https://sitename.com/category-name/44-tovar-name-2.html
    Redirect 301 /en/category-name-en/3244-tovar-name-1.html https://sitename.com/category-name/44-tovar-name-2.html
    Redirect 301 /uk/category-name-uk/3244-tovar-name-1.html https://sitename.com/category-name/44-tovar-name-2.html

  13. Виктор
    Виктор 31.01.2018 Ответить
    смотря что вы хотите сделать.

    RewriteRule ^(ru|en|uk)/category-name-ru/3244-tovar-name-1.html$ category-name/44-tovar-name-2.html [L,R=301]
    Это если вы просто хотите именно эти три урла, в условие мы просто перечили домены

    если же у вас и в остальном есть условия например вам нужно отрезать 32 из название товара и оставить тольок 44 то будет немного по другому.
    если к этому нужно будет добавить еще и замену 1.html >2.html то правило еще изменитяс, если это будет n+1 то опять же еще рез поменяется.
  14. Кирилл 14.02.2018 Ответить

    добрый день помогите убрать папку razdel из url http://automalyar-sam.ru/razdel/drel.php
    что нужно вставить вместо dir2

    RewriteCond %{REQUEST_URI} ^(.*)/razdel/(.*)$

    RewriteRule ^(.*)$ %1/dir2/%2 [R=301,L]
  15. Виктор
    Виктор 24.02.2018 Ответить
    RewriteCond %{REQUEST_URI} ^(.*)/razdel/(.*)$
    RewriteRule ^(.*)$ %1/%2 [R=301,L]
  16. Андрей 23.02.2018 Ответить
    Добрый день
    Подскажите, как удалить часть УРЛ из адреса ( для СЕО, что бы избавиться от дубликата контента, т.к. один и тот же контент доступен по двум адресам)
    У меня есть https://solray.com.ua/infrakrasnaya-plenka/heat-plus-standart/spn_310.html нада что бы все страницы такого типа переадресовавались на один уровень выше
    https://solray.com.ua/infrakrasnaya-plenka/spn_310.html

    Спасибо.
  17. Владислав 17.04.2018 Ответить
    Здравствуйте, не могу разобраться, маюсь уже сутки. Есть адреса:
    /kvartiry/studii/28-7/
    /kvartiry/odnokomn/28-7/
    /kvartiry/dvukomn/28-7/
    /kvartiry/trehkomn/28-7/
    Нужно чтобы они редиректились на аналогичные типа:
    /kvartiry/28-7/
    /kvartiry/28-7/
    /kvartiry/28-7/
    /kvartiry/28-7/
    Писал и так.
    RewriteCond %{HTTP_HOST} ^domen/kvartiry/studii/(.*)$
    RewriteRule ^(.*)$ /kvartiry/%1 [R=302,QSA,L]

    и Так

    #RewriteCond %{HTTP_HOST} ^domen\.ru& [NC]
    #RewriteRule ^kvartiry/studii/(.*)$ /kvartiry/$1 [R=302,QSA,L]

    что я могу делать не так?
  18. Виктор
    Виктор 14.05.2018 Ответить
    RewriteCond %{REQUEST_URI} ^/kvartiry/(.+[^/])/28-7/$
    RewriteRule ^/kvartiry/(.+[^/])/28-7/$ /kvartiry/$1 [R=302,QSA,L]
  19. Владимир 19.04.2018 Ответить
    Здравствуйте. А как сделать редирект, когда подставляются цифры на конец url, а сайт доступен.
  20. Виктор
    Виктор 14.05.2018 Ответить
    Нужно больше информации
  21. Иван 18.05.2018 Ответить
    Здравствуйте. Существует проблема. На сайте возможны дубли страниц вида: http://site.ru/page1/page1/page1/ Притом отображается одна и та же страница если я зайду http://site.ru/page1 или http://site.ru/page1/page1 . На 404 страницу не переходит. Подскажите пжл, в чем может быть проблема ?
  22. Виктор
    Виктор 25.05.2018 Ответить
    Вам нужно в регулярном выражение добавить исключения повторения цикла
    Исключить можно знаком
    !
    Например
    RewriteCond %{REQUEST_URI} !^page1.php$ 
    RewriteRule (.*)$ page.php/$1 [R=302,QSA,L]

Оставить комментарий