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

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

SyntaxHighlighter.defaults['auto-links'] = true; SyntaxHighlighter.defaults['toolbar'] = false; SyntaxHighlighter.defaults['tab-size'] = 7; SyntaxHighlighter.defaults['wrap-lines'] = true; SyntaxHighlighter.all() Для большинства проектов нашей студии приходится использовать 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] 
# перенаправляет все урлы на главную

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

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

  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

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