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] 
# перенаправляет все урлы на главную

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

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

  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]
  23. Андрей 24.07.2018 Ответить
    Если страница не найдена, то редирект:

    site.ru/abcd-efg
    не найдено, 404
    редирект на 2018.site.ru/abcd-efg

    На домене новый сайт. Но старый работает на подомене. Надо, чтобы посетители по старой ссылке на отфутболивались.
    Не могу никак придумать.

    Спасибо за идею!
  24. Петр 08.08.2018 Ответить
    Здравствуйте!
    Подскажите, пожалуйста.
    Требуется все url сайта, заканчивающиеся .php обрезать .php и добавить слеш. Средствами 301 редиректа в
    .htaccess
    То есть
    https://klondike-studio.ru/blog/snipet-for-htaccess.php
    привести к виду
    https://klondike-studio.ru/blog/snipet-for-htaccess/
    Не могу найти решение или слеш к php добавляется или ошибка сервера, синтаксиса.

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