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

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
   # Разрешает переход по символическим ссылкам.
  • Инициализация редиректов нужна 1 раз в файле но в самом верху

Перенаправляем протокол https на http

RewriteCond %{HTTPS} on 
   # Проверяем наличие https в URL. 
RewriteRule ^.*$ http://%{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 ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.
  • Вставить код в начале .htaccess до ЧПУ
  • Используйте или Letsencrypt или платный сертификат, не используйте самоподписанные сертификаты.
  • В зависимости от конфигурации веб сервера этот редирект может не сработать, причина в определения включен ли сейчас https, данный редирект может быть написан множеством способов, просто подберите тот который будет работать конкретно у вас.

Удалить www

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
   # Проверяем, содержит ли домен www (в начале URL).
RewriteRule ^(.*)$ https://%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 ^(.*)$ https://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 ^(.*)$ https://klondike-studio.ru/  [R=301,L]
  • В последнем шаблоне OR не требуется

Перенаправляет все 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 не является частью %{REQUEST_URI} и не может быть выделен RewriteRule в

Удалить 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
  • Для удаления всех GET параметров просто поставьте в URL"куда" знак вопроса
  • GET не является частью %{REQUEST_URI} и не может быть выделен RewriteRule в
  • (^|&).....($|&) нужен поскольку первый 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)

  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. Виктор 31.07.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. Максим 11.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 добавляется или ошибка сервера, синтаксиса.
  25. Мария
    Мария 11.10.2018 Ответить
    У вас GET параметр в урле, он не является частью requestURI и не может быть перенаправлен стандартным образом.
    Для этого используются двухуровневые конструкции
    воспользуйтесь сервисом
    https://donatstudios.com/RewriteRule_Generator
  26. Сергей 24.12.2018 Ответить
    Сайт на Joomla3+Virtuemart3
    Есть .htaccess:

    <IfModule autoindex>
    IndexIgnore *
    </IfModule>
    #Options +FollowSymlinks
    Options -Indexes
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.rep\.amarti\.ru$ [NC]
    RewriteRule ^(.*)$ https://rep.amarti.ru/$1 [R=301,L]
    RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
    RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
    RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
    RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
    RewriteRule .* index.php [F]
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteCond %{REQUEST_URI} !^/index\.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* index.php [L]

    Если руками подписать в конце "/index.php" или "/index.html" он там и останется. Как убрать?
    И еще не работает переадресация с 404 кодом на страницу ошибки, сама страница есть в корне.
  27. Виктор
    Виктор 15.01.2019 Ответить

    RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
    # URL cодержит index.php в конце.
    RewriteCond %{REQUEST_METHOD} =GET
    # Выявляем GET запрос в URL (не POST).
    RewriteRule ^(.*)$ %1/ [R=301,L]
    # Удалить index.php из URL.
  28. Виктор
    Виктор 15.01.2019 Ответить

    RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
    # URL cодержит index.php в конце.
    RewriteCond %{REQUEST_METHOD} =GET
    # Выявляем GET запрос в URL (не POST).
    RewriteRule ^(.*)$ %1/ [R=301,L]
    # Удалить index.php из URL.
  29. user 07.02.2019 Ответить
    Добрый день! подскажите, пожалуйста, делаю редирект страницы со знаком вопроса в url, нашла правило для такого случая, вроде лучик света есть, но в конце url появилось /%3f
    RewriteEngine on
    RewriteBase /
    Options +FollowSymLinks
    RewriteCond %{QUERY_STRING} ^art_(id=.*)
    RewriteRule ^(article)$ /$1?%1 [R=301,L]
    RewriteCond %{QUERY_STRING} ^orderby=product_list&DescOrderBy=ASC&Itemid=74&option=com_virtuemart&page=shop.browse&category_id=33&manufacturer_id=0&keyword=&keyword1=&keyword2=&limit=30&limitstart=5
    RewriteRule (.*) http://www.arenda-service.by/?page=shop.browse&category_id=33/? [L,R=301]
  30. Виктор
    Виктор 11.02.2019 Ответить
    Для начала вам нужно сделать нормальный редирект.
    Обратите внимание что каждый квери пишется отдельно а не в общую копилку, каждый & должны быть отдельны
    так же в реврайт руле не забывайте экранировать спецсимвол вопроса /\?page=...
  31. Максим 12.02.2019 Ответить
    Добрый день!
    Подскажите, пожалуйста, если убрать / в конце url, он станет считаться другой страницей ?
  32. Виктор
    Виктор 14.02.2019 Ответить
    любое изменение в урле
  33. Денис 28.09.2019 Ответить
    Добрый день! Подскажите, пожалуйста, как сделать редирект с сайта http://site.ru/all-materials/item/17977-zagolovok-novosti17977 на http://site.ru/zagolovok-novosti17977/
    номер (как 17977) - уникальный для каждой страницы в папке item и имеет значения от 1 до 50000.
    Другими словами, мне нужно вырезать часть all-materials/item/ , вырезать число от 1 до 50000 и дефис, добавить в конце слэш. Подскажите, как сделать правильно.
  34. Виктор
    Виктор 30.09.2019 Ответить
    Как-то так
    RewriteRule ^all\-materials/item/([0-9]{1,})\-(\w+)\-(\w+)$ /zagolovok\-$2$3$1/? [L,R=301]

    ^all\-materials/item/ - начало строки и неизменный текст
    [0-9]{1,} - от нуля до девяти, повторить 1 раз и более
    \- прекратится повторение поскольку будет слеш.
    () - групаа по сути каждая скобка нумеруется 1 2 3 и так далее
    $2$3$1 - вывести группу вторую потом третью потом первую
    нужно проверить но должно работать


  35. Виктор
    Виктор 16.10.2019 Ответить
    RewriteRule ^(catalog[0-9]{1,}.)+/ad/([0-9]{1,})$ $1/$2? [L,R=301]
    Но у я написал исходя из вашей логики а в ней нет каталоги отличаются цифрами и объявления из цифр. Если у вас есть реальные ссылки то можно составить более качественное правило

  36. Алексей 17.10.2019 Ответить
    Добрый день! Спасибо за ответ.

    Если уточнить какова именно цель.
    То например,
    https://site.ru/холодильник/ad/125, https://site.ru/печь/ad/167, https://site.ru/чайник/ad/345
    Хотелось бы упростить поиск до независимо от каталогов https://site.ru/125 https://site.ru/167 https://site.ru/345 так как №объявления у каталогов не пересекаются, а просто идут по возрастающей на всем сайте.

    https://site.ru/не важно какой каталог/ad/125 - https://site.ru/125

    Спасибо за помощь!

  37. Виктор
    Виктор 17.10.2019 Ответить
    RewriteRule ^(.+)/ad/([0-9]{1,})$ /$1? [L,R=301]
  38. Алексей 17.10.2019 Ответить
    Еще раз спасибо за ответ!

    Все работает, но в обратную сторону.
    https://site.ru/холодильник/ad/125 - https://site.ru/холодильник, https://site.ru/печь/ad/167 - https://site.ru/печь

    Изначально я экспериментировал с такими вариантами
    RewriteRule ^catalog/(.+)$ /$1 [R=301,L]
    RewriteRule ^(.*)ad/(.+)$ /$1$2 [R=301,L]
    Url выглядел как нужно, но "ломалось" многое другое

    Насколько я понимаю "ломалось" все из за динамичности ссылок, то что ссылка редиректа непостоянная

    Спасибо за помощь!
  39. Виктор
    Виктор 18.10.2019 Ответить
    дайте пример в табличке урл был урл стал, штук 5-6
    а так же опишите что именно ломалось "другое"
  40. Алексей 18.10.2019 Ответить
    Добрый день!

    Ломалось, то что url https://site.ru/холодильник/ad/125 редиректился https://site.ru/125 в адресной строке, то есть часть url действительно визуально пряталось от пользователя, но сам url https://site.ru/125 вел не на страницу https://site.ru/холодильник/ad/125.
    Было по разному:
    https://site.ru/125 (https://site.ru/холодильник/ad/125) мог привести на главную,
    https://site.ru/573 (https://site.ru/печь/ad/573) на "сломанную" страницу, где сам продукт 573 есть, но присутствует и много лишних модулей, которых там не должно быть.

    Говоря об этом правиле RewriteRule ^(.+)/ad/([0-9]{1,})$ /$1? [L,R=301]
    Получилось так:
    https://site.ru/холодильник/ad/125 - https://site.ru/холодильник
    https://site.ru/холодильник/ad/256 - https://site.ru/холодильник
    https://site.ru/печь/ad/53 - https://site.ru/печь
    https://site.ru/печь/ad/167 - https://site.ru/печь
    https://site.ru/чайник/ad/288 - https://site.ru/чайник
    https://site.ru/чайник/ad/750 - https://site.ru/чайник

    То есть, страница конкретного продукта перенаправляется на страницу каталога

    Спасибо за помощь!
  41. Виктор
    Виктор 21.10.2019 Ответить
    не забывайте что редирект реально перекидывает урл страницы и за отдачу по этому урлу отвечает уже ЧПУ
    А что оно там у вас находит одному разработчику известно. Сдается мне что как-раз по этому урлу ничего не находится. По этому и чуда иногда не происходит.
    Разберитесь почему страница
    https://site.ru/холодильник/ad/125. не отдает нужный контент, это точно не в текущем редиректе проблемам
  42. Сергей 12.12.2019 Ответить
    Здравствуйте. Подскажите как заменить все _ на -

    Делаю так: RewriteRule ^(catalog/)(.*)_(.*)$ $1$2-$3 [R=301,L]
    Так заменяет везде. Мне нужно сделать ограничение.

    Сейчас такая ссылка
    https://site.ru/catalog/bolt_shatunnyj/c/seat_mii/

    Нужно заменить на
    https://site.ru/catalog/bolt-shatunnyj/c/seat_mii/

    Тоесть убрать все _ до /c
  43. Виктор
    Виктор 12.12.2019 Ответить
    с группами все правильно у вас
    RewriteRule ^catalog/test_222_22_2_html$ /catalog/test\-222\-22\-2\-html? [L,R=301]

    можно попробовать вот так
    RewriteRule ^(.+)_(.+)$ $1\-$2? [L,R=301]

    или как вот тут
    RewriteCond %{THE_REQUEST} _
    # Проверяем, повторяется ли слеш (//) более двух раз.
    RewriteRule .* /$0 [R=301,L]
    # Исключаем все лишние слеши.

  44. Сергей 12.12.2019 Ответить
    К сожалению наработает.
  45. Юлия 17.12.2019 Ответить
    Добрый день, подскажите пожалуйста, как корректно сделать перевод с папки архив и внутренних адресов на каталог?

    https://belvideo.ru/catalog/arkhiv/videokamera-ip-el-idm2-1-3-6-ap/ на https://belvideo.ru/catalog
    https://belvideo.ru/catalog/arkhiv/videokamera-ip-el-idm2-2-8-6-ap/ на https://belvideo.ru/catalog
    https://belvideo.ru/catalog/arkhiv/videokamera-*************/ на https://belvideo.ru/catalog

    Спасибо
  46. Виктор
    Виктор 18.12.2019 Ответить
    RewriteRule ^catalog/arkhiv/videokamera\-.+$ /catalog? [L,R=301]
  47. Сергей 22.12.2019 Ответить
    Здравствуйте, подскажите как сделать 301 редирект, чтобы:
    https://site.ru/post перенаправляло на https://site.ru/post.html
    Чтобы это правило работало только для постов (блога WP) - за исключение категорий и страниц
  48. Виктор
    Виктор 22.12.2019 Ответить
    так делать не нужно, если у вас нет явной причины зачем это делать.
    во первых у вас сайт не на html а на php и для того чтобы его запускать как php вам придется подменять текст план.

    RemoveHandler .html .htm
    AddType application/x-httpd-php .php .htm .html .phtml
    да и страница будет смотреться не так красиво.
    Зачем вам делать такой редирект?
  49. Сергей 23.12.2019 Ответить
    незнаю) всякие "seo"специалисты утверждают, что так поисковым роботам лучше понять - где именно страница, а где каталок, да и на сервер нагрузка должна меньше идти. Если расширение - то это страница, если слеш / - значит каталог и т. д.
  50. Виктор
    Виктор 23.12.2019 Ответить
    Крайне рекомендую вам отказаться от услуг таких "специалистов".
    Сокращение урла делает его более читаемым.
    В вашем случае я бы рекомендовал сделать редирект на закрытие урла, https://site.ru/post/
    Тут есть последние конфиги для этого.

  51. Сергей 29.12.2019 Ответить
    слешем - обозначается конец каталога, а у вас здесь пост, вот это не правильно. Если это страница - у неё должно быть расширение, чтобы сервер не искал, а сразу отрисовывал, вот у вас тут слеш стоит, и он думает что это каталог и пытается найти постоянно ещё ссылки, это нагружает сервер
  52. Виктор
    Виктор 30.12.2019 Ответить
    1. Нет веб серверу на это вообще разницы никакой, у него по умолчанию пытаться найти каталог, если нет то файл, это на уровне файловой системы (кстати каталог на уровне самой FS это файл, и файлов тоже нет это ссылки на набор айнодов) и тут трудностей никаких нет и быть не может, этим занимается вообще не веб сервер а файловая система.

    2. В линуксе нет расширений ! Во всех файловых системах линукс нет расширений как класса, запускаемость есть атрибут, чем интерпретировать файл пишется в первой строке файла, кстати в php тоже.
    Так что для линукс это опять же не является задачей, он просто не умеет думать категориями windows
    для линукса что файл 111 что 111.txt что .111 обычные файлы, ну ладно последний скрытый. Точка в имени файла это всего лишь символ точки на FS она никак не влияет, это просто для удобства не более.
    По этому серверу нет никакой разницы есть ли точка или нет.
    На это мнение ( выбора файл или каталог первый) реально может повлиять ваше ЧПУ но опять же оно должно работать штатно, про это сейчас разговора не шло.

    теперь для чего реально делают редиректы в урлах.
    1. удалить дубли поскольку дял поисковой системы урлы
    index.php/
    index.php
    Index.php
    это разные урлы а следовательно могут быть ошибочно проиндексированны, поскольку как правило ЧПУ движка это не исправляет
    2. Так же может быть и такая штука
    //
    /
    И его отсутствие и то и другое имеет место быть, эти зеркала тоже никто не закрывает, однако поисковику это другой урл, пусть даже клиент ткнул его случайно.

    3. урл делают более читаемым
    /index.php?ID=443&type=4&filtr=6532&category=63 просто не читаемо
    /catalog/tovar1 куда как читаемей вот и всве
    /catalog/tovar1.html - вы делаете его просто длиннее да еще в добавок это не html а код внутри реально php и вам прийдется это еще и исправлять в .htaccess


    Все подобные редиректы сделаны людьми которые пытаются думать что они шарят в SEO по факту вообще не понимая в файловой системе Ext4

    Вот вам яркий пример такого редиректа.
    Пример полной безграмотности и фундоментального не понимания что они делают.

    # Переключает url в нижний регистр, если найдены символы в верхнем регистре
    RewriteCond %{REQUEST_URI} [A-Z]
    # Убедитесь, что это не файл на диске.
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

    Тут пожалуй поясню, дел в том что линукс регистрозависимая система и файлы image.jpeg и Image.jpeg, действительно разные и данный редирект даст вам 404 в совершенно непредсказуемых местах, даже при реальном наличие файла. Кстати правило еще и с ошибкой сделано !-s - не симлинк а не файл !-f - вот так пишется файл.
    А для того чтобы ВИЗУАЛНО отличать файл это или директория по ссылке, достаточно сделать следующее. Если это каталог то закрывать слешем Если файл то не закрывать слешем, и даже убирать его
  53. Сергей 30.12.2019 Ответить
    ну дак всё таки может подскажите как сделать 301 редирект для постов на расширение .html? )) просто у меня ссылки уже поменяны, нужно редирект быстрее ставить, а то старые урлы выдают 404, пока ПС их не посчитала не рабочими(
  54. Виктор
    Виктор 30.12.2019 Ответить
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/index.php
    RewriteCond %{REQUEST_URI} !^/.+\.html
    RewriteRule ^(.*)$ $1.html [R=301,L]
  55. Сергей 30.12.2019 Ответить
    эх... блин, так и знал( у вордпресса это болячка, сейчас и категории и страницы редиректятся на .html
    а нужно чтобы только посты
  56. Виктор
    Виктор 30.12.2019 Ответить
    дайте пару ссылок которые должны редиректиться
  57. Сергей 31.12.2019 Ответить
    Вот посты, но они все разные:
    https://binarybets.ru/tikovaya-strategiya-na-1-minutu-s-tochnostyu-90.html
    https://binarybets.ru/super-podborka-indikatorov-obyoma-dlya-mt4.html

    А вот страницы:
    https://binarybets.ru/zhivoj-grafik

    И категории:
    https://binarybets.ru/category/analiz-rynka

    Может просто в .htaccess можно исключения прописать для страницы (так как их не много) и для типов ссылок, в которых есть "category"?
  58. Виктор
    Виктор 31.12.2019 Ответить
    я по wp не спец но звучит это именно как настройка ЧПУ .
    Поскольку категория или страница знает только сам вп
    ДУ

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    Соответственно индекс отвечает за дальнейшее распределение.
    что-то вроде такого
    https://www.templatemonster.com/ru/faq/kak-nastroit-chpu-v-wordpress/
  59. Сергей 01.01.2020 Ответить
    а в файле .htaccess зависит от того - куда ты вставишь кусок кода? У меня вот такой сейчас:

    Options +FollowSymLinks

    <IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/css
    </IfModule>

    <Files xmlrpc.php>
    order allow,deny
    deny from all
    </Files>

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteCond %{REQUEST_URI} ^/$
    RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
    RewriteRule ^(.*)$ https://binarybets.ru/? [L,R=301]
    RewriteCond %{REQUEST_URI} ^/$
    RewriteCond %{QUERY_STRING} ^/?paged=1
    RewriteRule ^(.*)$ https://binarybets.ru/? [L,R=301]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^api/([-_0-9a-z]+)/? /wp-admin/admin-ajax.php?action=$1 [QSA,L]
    RewriteRule ^api/([-_0-9a-z]+)/([0-9]+)/? /wp-admin/admin-ajax.php?action=$1&id=$2 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ / [QSA,R]
    RewriteRule ^index.html$ / [QSA,R]
    </IfModule>

    # END WordPress

    и то что вы дали не работает( пробовал вставлять ваш кусок кода везде

    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/index.php
    RewriteCond %{REQUEST_URI} !^/.+\.html
    RewriteRule ^(.*)$ $1.html [R=301,L]
  60. Виктор
    Виктор 09.01.2020 Ответить
    Попробуйте вот так
    Options +FollowSymLinks
    RewriteBase /
    
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    RewriteCond %{REQUEST_URI} ^/$
    RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
    RewriteRule ^(.*)$ https://binarybets.ru/? [L,R=301]
    
    RewriteCond %{REQUEST_URI} ^/$
    RewriteCond %{QUERY_STRING} ^/?paged=1
    RewriteRule ^(.*)$ https://binarybets.ru/? [L,R=301]
    
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^api/([-_0-9a-z]+)/? /wp-admin/admin-ajax.php?action=$1 [QSA,L]
    RewriteRule ^api/([-_0-9a-z]+)/([0-9]+)/? /wp-admin/admin-ajax.php?action=$1&id=$2 [QSA,L]
    
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !index\.php$
    RewriteCond %{REQUEST_URI} !.+\.html$
    RewriteRule ^(.*)$ $1.html [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    
    
    RewriteRule ^index.php$ / [QSA,R]
    RewriteRule ^index.html$ / [QSA,R]
    # END WordPress
    
    
    
    order allow,deny
    deny from all
    
    
    
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/css
    
    
  61. Сергей 14.01.2020 Ответить
    а подскажите, как в .htaccess запретить доступ для ПС к определённой папке и всё что в ней? а то через robots всё равно ПС заходит, даже если там запрещено
  62. Виктор
    Виктор 10.02.2020 Ответить
    самый простой способ это поместить или в эту папку
    RewriteCond %{REQUEST_URI} ^/arcicle_.+/\.html$
    https://htmlweb.ru/service/htpasswd.php
    или же указать его в главном .htaccess
    не забывайте что .htaccess может лежать в каждом каталоге свой.
    хотя вариантов решения куда больше 1
    или например через
    AllowOverride
  63. Сергей 01.02.2020 Ответить
    а подскаите пожалуйста, как предотвратить 302 редирект, когда урл вначале редиректит 302 с site.ru/post.html на site.ru/post и потом 301 на site.ru/post/
  64. Виктор
    Виктор 10.02.2020 Ответить
    ничего страшного, вес 301 теперь практически не передает, так что последовательность кодов не важна.
    Можно сделать одно правило которое будет учитывать большенство вариантов редиректов, в таком случае это будет один редирект, однако нет смысла.
  65. Andrei 06.02.2020 Ответить
    Добрый день. Спасибо за интересный материал.
    Подскажите, возможно ли сделать редирект с урлов вида:
    /article_80_60_80_80_80_80_60_80_80_80_80_60_80_80_120_80_80_100_20_80_20_60_120_80_120_20_40_40.html
    /article_80_100_20_80_80_80_80_80_80_80_40_80_80_20_60_80_60_80_120_20_60_80_40_100_100_120.html
    /article_80_60_80_80_80_80_60_80_80_80_80_80_40_60_80_80_60_20_20_100_80_60_40_40_20_40_60_80_40_60.html
    цифры, а так же их кол-во может быть разным и хотелось бы редиректить на урл /article.htm
    Возможно ли?
    Спасибо!
  66. Виктор
    Виктор 10.02.2020 Ответить
    RewriteCond %{REQUEST_URI} ^/arcicle_.+/\.html$
    RewriteRule ^(.+)$ /article.htm? [R=301,L]
  67. Виктор
    Виктор 11.02.2020 Ответить
    RewriteCond %{QUERY_STRING} (^|&)option\=com_wrapper($|&)
    RewriteCond %{QUERY_STRING} (^|&)amp;view\=wrapper($|&)
    RewriteCond %{QUERY_STRING} (^|&)amp;Itemid\=4($|&)
    RewriteRule ^index\.php$ /sport\-on\-line? [L,R=301]

    но думаю вам больше понравится вот такой вариант
    https://donatstudios.com/RewriteRule_Generator
  68. Александр 11.02.2020 Ответить
    это конечно вообще круть, спасибище большое!!!
  69. Руслан 13.02.2020 Ответить
    Дружище подскажи пожалуйста, как убрать цифры в url. Пример: site.ru/krossovki_1/muzhskie/nike/krossovki_nike_air_max_1_6, нужно сделать site.ru/krossovki/muzhskie/nike/krossovki_nike_air_max. Именно некоторые товары имеют одинаковые названия, возможно же как-то исправить?. Но вот категория Кроссовки одна, а почему-то добавляет цифру. Это cms так поставила.
  70. Виктор
    Виктор 14.02.2020 Ответить
    В вопросе недостаточно данных.
    1 повторяются ли цифры 1 или более раз?
    2. дай несколько вариантов урлов
    3. цифры всегда по _1_2 или есть варианты _123123 или даже _2_2_32
    То-же касается и урлов внутри например krossovki_1 тут только один вариант цифры ? или еще какие -то есть
    Сколько всего урлов таких ?
    вот пока такой вариант, он удалит все цифры в конце строки которые начинаются с _цифра или цифры _ цифра или цифры, конец строки
    в текущем примере удалит _1_6
    но подойдет и для удаления _12_3112
    Если тебе нужно будет удалять еще и цифры внутри то дай больше вариантов нужна статистика
    RewriteRule ^(.+)_[0-9]{1,}_[0-9]{1,}$ /$1? [L,R=301] 
  71. Руслан 14.02.2020 Ответить
    Благодарю за ответ Виктор. Вариант ниже не сработал. Конкретизирую.

    Суть в том что категория Кросовки одна, но пишет krossovki_1.
    К категории адидас присвоены еще разные категории, но пишет адидас_1

    Пример:
    krossovki_1/muzhskie/adidas/slancy_adidas_14
    krossovki_1/zhenskie/adidas_1/krossovki_adidas_samba_rose_4

    Вот еще варианты ссылок, для полного понимания:
    aksessuary/perchatki_2/nike_5/perchatki_nike
    aksessuary/perchatki_2/supreme_5/perchatki_supreme_1
    krossovki_1/zhenskie/reebok_1/krossovki_reebok_classic_leather_double_3
    aksessuary/sumki/supreme_6/sumka_supreme_18
    krossovki_1/detskie/adidas_2/krossovki_adidas_prophere_21

    Задача убрать все эти цифры на конце, типо _1, _5, _14 и т.д.
  72. Виктор
    Виктор 17.02.2020 Ответить
    RewriteRule ^(.+)_[0-9]{1,}/(.*)$ /$1/$2? [L,R=301]
    где .+ - один и более символов.
    _[0-9]{1,}/ - нижнее подчеркивание и любое количество цифр и слеш после цифры.
    $1 это первая скобка в начале , ну а бакс 2 это вторая скобка
  73. Руслан 19.02.2020 Ответить
    Благодарю. Но результата нет. Проблема в другом
  74. Алексей 15.03.2020 Ответить
    Здравствуйте, подскажите пожалуйста как в .htaccess записать что бы убрать часть урла до доменной зоны ?
    Например:
    Запрос идет на domain.com/luboe_imya_faila.php
    В адресной строке что бы стало domain.com
    т.е. обрезать все что идет после доменной зоны .com

    Заранее спасибо.
  75. Виктор
    Виктор 17.03.2020 Ответить
    А зачем так делать ? Опишите зачем именно вам это нужно, возможно вы пошли не в ту сторону.
    Что же касается отказаться от вообще всего что есть после домена, то тут я думаю вам поможет ajax притом на весь сайт, что вообще-то сомнительное решение.
    И опять же это явно самопись.
  76. Алексей 18.03.2020 Ответить
    Да вы правы Виктор. Решение было не в ту сторону.
    Возник другой вопрос.
    Скажите пожалуйста как по средствам .htaccess запретить прямой доступ на страницу ?
    Я вижу только одну возможную реализацию проверять Referrer.
    Например: Если сёрфер пришел с domain.com отображать страницу, иначе отображать 404.
    Подскажите пожалуйста как реализовать ?

    P.S. С удовольствием послушаю другие варианты, по мимо Referrer. Но как сделать мой вариант тоже пожалуйста подскажите =)
    Спасибо.
  77. Виктор
    Виктор 18.03.2020 Ответить
    Насколько я понял вы хотите ограничивать доступ если человек пришел по прямой ссылке.
    Тут действительно нужно определять рефери
    ! - отрицание

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://the-ok-domain.com [NC]
    RewriteCond %{HTTP_REFERER} !^http://your-domain.com [NC]
    RewriteRule ^ http://the-website-of-your-choosing.com/ [L,R]

    опишите более детально задачу, что и зачем вы пытаетесь сделать.

  78. Сергей 24.03.2020 Ответить
    Подскажите пожалуйста как как выполнить редирект с www.сайт.ru/category_tale/view?id=1 на www.сайт.ru/category_tale/1
    Где 1 может быть любой цифрой.
    Больше спасибо.
  79. Виктор
    Виктор 25.03.2020 Ответить
    RewriteCond %{QUERY_STRING} (^|&)id\=([0-9]{1,})($|&)
    RewriteRule ^category_tale/view$ /category_tale/%1? [L,R=301]


  80. Сергей 26.03.2020 Ответить
    Виктор, благодарен Вам что уделили время моему вопросу. Применил ваши правила в своём .htaccess но вместо редиректа на www.сайт.ru/category_tale/1
    Перенаправляет просто на
    www.сайт.ru/category_tale
    Слэш в конце всех url чистится правилом
    RewriteRule ^(.*)/$ /$1 [L,R=301]
  81. Виктор
    Виктор 26.03.2020 Ответить
    да там ошибка
    RewriteCond %{QUERY_STRING} (^|&)id\=([0-9]{1,})($|&)
    RewriteRule ^category_tale/view$ /category_tale/%2? [L,R=301]
  82. Виктор
    Виктор 02.04.2020 Ответить
    1. Со слеша редирект делать не нужно, домен должен быть закрытым.
    2. гет параметр без гет ? или там что-то дальше есть?
    3 сделать легко, вначале ответ на первые два
  83. Андрей 03.05.2020 Ответить
    Добрый день! Спасибо за шаблон, сейчас масса кусочков, но целиком файл редко встретишь. Буду благодарен за помощь с перенаправлением с .html на / в конце (такая структура осталась от WP). Сайт на статике, есть страницы .html, есть подпапки со страницами внутри, всего около 60. Применил ваш .htaccess для статических сайтов. Сейчас, если открываю /category(подпапка)/page.html, то всё подгружается, а если убираю .html, то отдает 404.
    Пробовал
    1. RewriteRule ^(.*)\.html$ https://%{HTTP_HOST}/$1 [R=301,L] - убирает .html и отдает 404
    2. Переписывал условия из динамического .htaccess, добавлял для проверки RequestURI \.html - вообще internal server error
    3. Кучу вариантов из сети

    Бьюсь второй день уже)) Подскажите пожалуйста!
  84. Виктор
    Виктор 04.05.2020 Ответить
    тут вариантов несколько
    1. у вас сайт на php но в конце html
    то они делаются по одному сценарию
    2. если у вас сайт на чистом html то по другому.
    Оба способа тут.
    https://klondike-studio.ru/standards/standartnyy-htaccess/
  85. Виктор
    Виктор 11.06.2020 Ответить
    GET не является частью урла, по этому в %{REQUEST_URI} он вообще не попадает. Так что редирект смотрится вот так

    RewriteCond %{QUERY_STRING} (^|&)prgpattern\=riosm\.html($|&)
    RewriteRule ^любое/$ /riosm.html? [L,R=301]

    RewriteCond %{QUERY_STRING} (^|&)prgpattern\=riosm\.html($|&)
    RewriteRule ^любое/любое/$ /riosm.html? [L,R=301]
  86. Иван 11.06.2020 Ответить
    Я наверное плохо изложил суть проблемы.
    Но к моему удивлению нашел рабочий результат. Если кому надо - публикую код

    RewriteCond %{QUERY_STRING} ^prgpattern=([^&\s]+)$
    RewriteRule ^(.*)$ /%1? [R=301,L]
  87. Дмитрий 23.06.2020 Ответить
    Добрый день
    Можете подсказать несколько вещей.

    1.Можно ли сделать такую структуру урла через htaccess ?
    Сейчас так: https://some.site/shop/category/vhidni-dveri?filter_brand=aplot&query_type_brand=or
    Нужно так: https://some.site/shop/category/vhidni-dveri/f/brand-aplot/

    2.Убрать спецсимволы с урл, как тут например
    https://some.site/shop/vikno-whs-72-dlya-skladskykh-prymishchen-povorotno-vidkryvne-1400%d1%851300/
    Должно быть:
    https://some.site/shop/vikno-whs-72-dlya-skladskykh-prymishchen-povorotno-vidkryvne-1400x1300/
  88. Виктор
    Виктор 25.06.2020 Ответить
    И да и нет
    ДА .htaccess используется для работы с ЧПУ
    и
    НЕТ - как правило за генерацию ЧПУ отвечает PHP а htaccess только перенаправляет запросы туда.
    Вот классический пример такой работы

    RewriteCond %{REQUEST_FILENAME} !-f
    # если это не файл
    RewriteCond %{REQUEST_FILENAME} !-l
    # и если это не линка
    RewriteCond %{REQUEST_FILENAME} !-d
    # и если это не директория
    RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
    # защита от цикла, если это не файл на который будет сделано перенаправление
    RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
    # то перенаправить запрос на ядро.
    И делается это потому что только движок ваш знает точно то это новость, а это картинка, это раздел а это категория и связь между гет парметром и ЧПУ тоже настраивается там.
    Так что для начала нужно определиться со следующими пунктами.
    1. Вам нужно только эти странички или вам в принципе нужно привести весь сайт в чувства.
    2. какой движок
    3. какой сайт ( это не секретная информация, вы платите яндексу за то чтоб ее распространять)
    4. Ваш .htaccess в студию
    5. Список всех урлов на замену.

    И да можно это сделать и чисто через .htaccess
  89. Диана 25.06.2020 Ответить
    Подскажите, пожалуйста, правила для htaccess, которое уберет все лишние слеши в урле

    например
    https://murkel.ru/blog/novinki-schleich-2018-iul-dekabr///
    https://murkel.ru///blog/novinki-schleich-2018-iul-dekabr/
    https:///murkel.ru/blog/novinki-schleich-2018-iul-dekabr/
    чтобы эти страницы редиректили на
    https://murkel.ru/blog/novinki-schleich-2018-iul-dekabr/

    в случае с каталогом товаров
    https://murkel.ru/catalog/ferma-schleich - главная страница
    https://murkel.ru/catalog/ferma-schleich/
    https://murkel.ru/catalog/ferma-schleich//
    https:///murkel.ru/catalog/ferma-schleich
    должны перебрасывать на основную
  90. Виктор
    Виктор 26.06.2020 Ответить
    ############################################################################
    #### Убираем повторяющиеся слеши (/) в URL ####
    ############################################################################
    RewriteCond %{THE_REQUEST} //
    # Проверяем, повторяется ли слеш (//) более двух раз.
    RewriteCond %{QUERY_STRING} !http(s|)://
    # Убедимся что это не урл в GET
    RewriteRule .* /$0 [R=301,L]
    # Исключаем все лишние слеши.
  91. Диана 18.07.2020 Ответить
    Спасибо большое, Виктор!
  92. Зан 28.06.2020 Ответить
    Здравствуйте.
    Все проиндексированные страницы ведут сейчас на 404 после изменения структуры. Нагуглил, что проблему можно решить через htaccess. Прошу, пожалуйста, подсказать что нужно прописать для редиректа всех ссылок с цифрами в начале на новые версии без цифр. Пример:
    site.ru/421-nazvanie-materiala =>
    site.ru/nazvanie-materiala

    Диапазон чисел 0-500, если это имеет значение.
  93. Виктор
    Виктор 29.06.2020 Ответить
    Это для данного случая ( цифра любая)
    RewriteRule ^[0-9]{1,}\-nazvanie\-materiala$ /nazvanie\-materiala? [L,R=301]
    .
    Это для всех кто начинается с цифр
    RewriteRule ^[0-9]{1,}\-(.+)$ /$1? [L,R=301] 
  94. 01.07.2020 Ответить
    Можете эту статью написать но для nginx
  95. Виктор
    Виктор 02.07.2020 Ответить
    Если дойдут руки напишу, даже этот материал оформить должным образом не успеваю.
    В nginx все немного сложнее поскольку там еще зависит и от конфигурации сервера nginx+FPM или nginx+apache конфиги будут отличаться.
  96. Иван 26.08.2020 Ответить
    Добрый день!
    А как сделать:
    https://site.ru/flowers.php ---> https://site.ru/my-flowers
    Но чтобы скрипт не переносить и он остался по адресу https://site.ru/flowers.php

    Я написал так:
    RewriteRule ^flowers.php https://site.ru/my-flowers [R=301,L]
    RewriteRule ^my-flowers$ https://site.ru/flowers.php [L]

    Но получился циклический редирект...
    И придумать ничего не получается
  97. Клондайк 09.11.2020 Ответить
    RewriteRule ^flowers.php /my-flowers [L]
    И все
  98. Артем 12.09.2020 Ответить
    Здравствуйте, подскажите пожалуйста как привести такой урл ...mysite/categories/page/2/ в такой вид ...mysite/categories/page2/
    wordpress (posts_navigation) Спасибо
  99. Клондайк 23.09.2020 Ответить
    RewriteRule ^categories/page/([0-9]{1,})/$ /categories/page$1/? [L,R=301]
    Если у вас конечные странички это цифры, если не цифры то
    замените ([0-9]{1,}) на .+
  100. Алексей 23.09.2020 Ответить
    Доброго дня! Отличный ресурс.
    У меня есть один вопрос. Не смог своими силами

    В каталоге есть ссылки на один и тот же товар в разных категориях вида:
    https://site.ru/catalog/category1/category2/category3/product_name_1.html
    https://site.ru/catalog/category1/category2/product_name_1.html
    https://site.ru/catalog/category1/product_name_1.html
    https://site.ru/catalog/category4/category5/product_name_1.html
    и т.д.
    как привести их все к одному, но уже другому, товару:
    https://site.ru/catalog/category1/category2/category3/product_name_2.html
  101. Клондайк 23.09.2020 Ответить
    данный вопрос не совсем к .htaccess
    это у вас ошибка проектирования структуры сайта.

    RewriteCond %{REQUEST_URI} ^/catalog/.+/([^/].+\.html) [NC] 
    # если в урле есть каталог и хтмл в конце то вырезать кусок сзади до первого слеша
    RewriteCond %{REQUEST_URI} !^/catalog/category1/category2/category3/product_name_2.html [NC]
    # но не конечный каталог, дабы небыло цикла.
    RewriteRule .* /catalog/category1/category2/category3/%1? [R=301,L]
  102. Алексей 23.09.2020 Ответить
    Спасибо за ответ. Согласен, что ошибка проектирования, да. Она появляется, если в настройках инфоблока каталога Битрикс не поставить галочку "Использовать основной раздел для показа элемента" и... "Привет" куча дублей страниц в разных категориях

    Вобщем опишу вопрос немного по-другому.
    Можно ли сделать редирект всех страниц, содержащих в url имя "product_name_1.html" на одну страницу -> /catalog/category1/category2/category3/product_name_2.html
  103. Клондайк 19.10.2020 Ответить

    RewriteCond %{REQUEST_URI} ^.+/product_name_1.html [NC]
    RewriteRule .* /catalog/category1/category2/category3/product_name_1.html? [R=301,L]
  104. Андрей 14.10.2020 Ответить
    Подскажите, как сделать рабочий редирект со страниц вида http://klondike-studio.ru/?ххххх на главную.
    Перепробовал ваши советы, получаю "Циклическое перенаправление на странице"

    И если есть возможность (это не критично), чтобы не трогало страницы вида http://klondike-studio.ru/index.php?ххххххх

    Заранее спасибо
  105. Клондайк 15.10.2020 Ответить
    Основная проблема у вас будет в том что в Реврайт рул попадает только сам URL.
    GET не является частью URL, по этому его просто нельзя выделить ;)
    Для этого вам нужно будет испльзовать двухуровневую конструкцию, так же нужно понимать какое количество параметров вы хотите редиренктить
    если 1 то это одно , если их несколко то другое.

    RewriteCond %{QUERY_STRING} (?:^|&)ххххх(?:$|&)
    RewriteRule ^$ /? [L,R=301]

    А вот так если любой квери
    # 301 --- http://klondike-studio.ru/?любое=>; http://klondike-studio.ru/
    RewriteCond %{QUERY_STRING} (?:^|&).+(?:$|&)
    RewriteRule ^$ /? [L,R=301]

  106. Андрей 16.10.2020 Ответить
    Спасибо. Второй вариант работает.
    А по первому:
    как будет выглядеть если http://klondike-studio.ru/?только цифры (думаю понятно откуда проблема - раньше стоял WP и теперь куча внешних ссылок с ?)
  107. Клондайк 19.10.2020 Ответить
    RewriteCond %{QUERY_STRING} (?:^|&)([0-9]{1,})(?:$|&)
    RewriteRule ^$ /? [L,R=301]
  108. Алексей 05.11.2020 Ответить
    Добрый день!

    Сайт на джумле.
    На сайте настроен редирект со слеша на без слеша.

    Сделали мультиязычность, и теперь будучи на англ. версии товар не добавляется, потому что работает редирект на без слеша.
    Отключал его и всё работает.

    Подскажите, как добавить слэш на конце только для урлов где встречается "en?" ?
  109. Виктор
    Виктор 05.11.2020 Ответить
    добавьте в правило дополнительное условие
    К сожалению вы не привели примера ссылок где именно у вас en
    но допустим это в site.ru/en/....
    то будет так:
    RewriteCond %{THE_REQUEST} //
    RewriteCond %{QUERY_STRING} !http(s|)://
    RewriteCond %{REQUEST_URI} ^/en/.*$ [NC]
    # если урл начинается с en
    RewriteCond %{REQUEST_URI} !^/ru/.*$ [NC]
    #  а это если НЕ ru, знак ! отрицает   условие, если потребуется
    RewriteRule .* /$0 [R=301,L]
    


  110. Клондайк 09.11.2020 Ответить
    У вас в ссылке гет параметры с ними нужно работать отдельно, поскольку в прошлом правиле мы их удаляли и я о этом писал
    К примеру чтоб выделить конкретно эту ссылку вам понадобится вот это

    RewriteCond %{QUERY_STRING} (?:^|&)option\=com_jshopping(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)controller\=cart(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)task\=add(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)category_id\=18(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)product_id\=77(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)ajax\=1(?:$|&)
    RewriteCond %{QUERY_STRING} (?:^|&)_\=1604576360370(?:$|&)
    RewriteRule ^en/index\.php$ http://iz\-iv.ru/? [L,R=301]

    Насколько я понимаю вам нужно что-то такое
    RewriteCond %{THE_REQUEST} //
    RewriteCond %{QUERY_STRING} !http(s|)://
    RewriteRule ^en/index\.php$ http://iz\-iv.ru/ [QSA,L,R=301]
  111. Клондайк 09.11.2020 Ответить
    Mixed Content: не какого отношения к самому редиректу не имеет,
    у вас на сайте https и одна из ссылок на файл ссс и тд, посмотрите по коду, осталась со старым протоколом, собственно поулчается что в защищеном сайте часть контента не защищена
    микс контент собствено, вам нужно убрать протокол поменяв его или на https или на //
  112. Михаил 05.11.2020 Ответить
    Здравствуйте! У меня появились дубли страниц вида:
    https://t-trade.spb.ru/lex/%E2%80%8B/published/publicdata/TISHKOFFALKO/attachments/SC/products_pictures/blog/33/lex/lex/gazovaja-varochnaja-panel-lex-chao000350

    Нормальный адрес страницы:
    https://t-trade.spb.ru/gazovaja-varochnaja-panel-lex-chao000350

    Сложность в том что такая категория существует и она нужна: https://t-trade.spb.ru/lex/
    Что посоветуете?
  113. 09.11.2020 Ответить
    существует два вида квантификатор
    жадных
    и ленивых
    думаю вам нужно просто подобрать свой квантификатор.

    вот ваш пример
    RewriteRule ^lex/%E2%80%8B​/published/publicdata/TISHKOFFALKO/attachments/SC/products_pictures/blog/33/lex/lex/gazovaja\-varochnaja\-panel\-lex\-chao000350$ /gazovaja\-varochnaja\-panel\-lex\-chao000350? [L,R=301]

    попробуем поиграть с ним
    RewriteRule ^lex/%E2%80%8B​/published/publicdata/TISHKOFFALKO/attachments/SC/products_pictures/blog/33/lex/lex/gazovaja\-varochnaja\-panel\-lex\-chao000350$ /gazovaja\-varochnaja\-panel\-lex\-chao000350? [L,R=301]

    Можем сразу поменяь точно динамическую часть.
    RewriteRule ^lex/%E2%80%8B​/published/publicdata/TISHKOFFALKO/attachments/SC/products_pictures/blog/33/lex/lex/(.+[^/])$ /$1 [L,R=301]

    (.+[^/]) - это группа любых символов больше чем 1 ( не включая ноль символов)
    [^/] но не слеш ( то есть после последнего слеша
    К примеру так
    НО нужно больше Количество урлов для понимания
  114. Михаил 09.11.2020 Ответить
    При попытке вставить в .htaccess любого из этих вариантов сайт вообще перестает работать
  115. Виктор
    Виктор 10.11.2020 Ответить
    нужен весь htaccess и четкое тз, несколько примеров ссылок
  116. Антон 05.11.2020 Ответить
    Классная статья и наглядная.
    Заметил очепятку в данном кейсе, который мне помог - dir1 повторяется дважды, надо в третьей строчке dir2.
    Виктор, поправьте в Вашей полезной статье ;)

    Перенаправляет все содержимое каталогов
    http://site.ru/dir1dir2/любое/любое


    RewriteCond %{REQUEST_URI} ^/dir1/(.*)$
    # если строка начинается с /dir1/
    RewriteRule ^(.*)$ /dir1%1 [R=301,L]
    #Перенаправить все URL с начинающиеся с dir1 на dir2 с сохранением дальнейшей структуры URL
  117. Клондайк 09.11.2020 Ответить
    Угу спасибо, классическая ситуация сапожник без сапог, нет времени на оформление даже такого материала.
    В далеком бедующем как-нибудь оформлю в виде полноценной статьи поскольку их по mod_rewrite нормальных 1 на хабре во всем интернете.
    НО в данном случае отличие есть перед дир ничего нет и работают тольок /dir..... во втором вариенте ......./dir/......
  118. koss 11.11.2020 Ответить
    Подскажите пожалуйста как настроить переадресацию:

    доступно 3 адреса
    сайт.kiev.ua
    сайт.kiev.ua/
    сайт.kiev.ua/?

    Какой адрес нужно оставить основным и как правильно сделать переадресацию?

    Спасибо.

    htaccess содержимое: https://www.dropbox.com/s/z72283g0pghhnjd/htaccess.txt?dl=0
  119. far 24.11.2020 Ответить
    Добрый день. Подскажите пожалуйста как решить вопрос переадресации:

    Нужно чтобы с site.ru/nazvanie-stranica789 - переносил на site.ru/nazvanie-stranica. Вырезая цифры.
    Но чтобы site.ru/page/2 продолжал открывать свою страницу

    RewriteRule ^(.+)/([0-9]+)/?$ /$1/ [R=301,L,NE]

    вот такой я нашел - но он все цифры вырезает в урле.

    Спасибо всем кто откликнется!
  120. Виктор
    Виктор 08.12.2020 Ответить
    Тебе нужно добавить в маску отрицание
    слеша
    в таком случае в урле будут только те ссылки что находятся на первом уровне
    [^\/]+[0-9]{1,}

    где [^\/] - не слеш
    https://regex101.com/r/G5jp1d/1
  121. Игорь В. 18.01.2021 Ответить
    Здравствуйте. Появилась проблема на сайте. Настраивал .htaccess и не получилось у меня сделать следующее:
    1.Когда к такой структуре урл mysite.ru/papka1/papka2/zapis1 добавляеш что нибуть в центре, например еще одру папку которой не существует типу mysite.ru/papka1/nespapka/papka2/zapis1 все нормально открывает запись и выдает код 200 вместо 404.
    2. Когда к такой структуре урл mysite.ru/papka1/papka2/zapis1 в конце через / добавляеш любые символы типу mysite.ru/papka1/papka2/zapis1/lubsimvoly то перебрасывает на домашнюю страницу сайта, а не отправляет на эту же запись без символов 301 редиректом.

    Вот собственно сам .htaccess

    RewriteEngine On
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]


    Прошу помощи...
  122. Виктор
    Виктор 15.02.2021 Ответить
    Такое поведение достаточно частое для разных движков тут нет особого криминала.
    поставьте риал каноникал на страничках но они как правило все-равно не попадут в индексацию.
  123. Анастасия 01.02.2021 Ответить
    Добрый день, можете помочь?


    1. https://site.ru/? (должно отправлять на https://site.ru с 301 редиректом. слеш убирается, но код получается 200)
    2. https://site.ru/ (аналогично, должен убираться слеш с 301 редиректом. причем на всех прочих страницах слеш убирается, код как нужно - 301. тут слеш убирается, но код 200)

    код из htaccess:


    ## Включение модуля mod_rewrite
    <IfModule mod_rewrite.c>
    RewriteEngine On
    ##

    ##Корневая директория - начало
    RewriteBase /
    ##Корневая директория конец

    ##Редирект с index.php на / - начало
    RewriteCond %{THE_REQUEST} !^POST
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$
    RewriteRule ^index\.php$ http%2://besttransfer.ru [R=301,L]
    ##Редирект с index.php на / - конец




    RewriteCond %{ENV:HTTPS} !on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


    Redirect 301 /home https://besttransfer.ru


    ##Редирект с www на без www - начало
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
    ##Редирект с www на без www - конец


    RewriteRule ^(.*)/$ /$1 [R=301,L]


    RewriteCond %{QUERY_STRING} ^from=webmaster$ [NC]
    RewriteRule ^$ /? [R=301,L]


    RewriteCond %{QUERY_STRING} (^|&)start\=30($|&)
    RewriteRule ^blog$ /blog? [L,R=301]


    # в строке HTTP-запроса отлавливаем запрос вида /?\d*
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?\d*\ HTTP/
    # и делаем редирект на корень сайта с удалением GET переменных (знак вопроса ОБЯЗАТЕЛЕН)
    RewriteRule ^ https://besttransfer.ru/? [R=301,L]


    RewriteCond %{THE_REQUEST} //
    # Проверяем, повторяется ли слеш (//) более двух раз.
    RewriteRule .* $0 [R=301,L]
    # Исключаем все лишние слеши.




    # If there are caps, set HASCAPS to true and skip next rule
    RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]

    # Skip this entire section if no uppercase letters in requested URL
    RewriteRule ![A-Z] - [S=28]

    # Replace single occurance of CAP with cap, then process next Rule.
    RewriteRule ^([^A]*)A(.*)$ $1a$2
    RewriteRule ^([^B]*)B(.*)$ $1b$2
    RewriteRule ^([^C]*)C(.*)$ $1c$2
    RewriteRule ^([^D]*)D(.*)$ $1d$2
    RewriteRule ^([^E]*)E(.*)$ $1e$2
    RewriteRule ^([^F]*)F(.*)$ $1f$2
    RewriteRule ^([^G]*)G(.*)$ $1g$2
    RewriteRule ^([^H]*)H(.*)$ $1h$2
    RewriteRule ^([^I]*)I(.*)$ $1i$2
    RewriteRule ^([^J]*)J(.*)$ $1j$2
    RewriteRule ^([^K]*)K(.*)$ $1k$2
    RewriteRule ^([^L]*)L(.*)$ $1l$2
    RewriteRule ^([^M]*)M(.*)$ $1m$2
    RewriteRule ^([^N]*)N(.*)$ $1n$2
    RewriteRule ^([^O]*)O(.*)$ $1o$2
    RewriteRule ^([^P]*)P(.*)$ $1p$2
    RewriteRule ^([^Q]*)Q(.*)$ $1q$2
    RewriteRule ^([^R]*)R(.*)$ $1r$2
    RewriteRule ^([^S]*)S(.*)$ $1s$2
    RewriteRule ^([^T]*)T(.*)$ $1t$2
    RewriteRule ^([^U]*)U(.*)$ $1u$2
    RewriteRule ^([^V]*)V(.*)$ $1v$2
    RewriteRule ^([^W]*)W(.*)$ $1w$2
    RewriteRule ^([^X]*)X(.*)$ $1x$2
    RewriteRule ^([^Y]*)Y(.*)$ $1y$2
    RewriteRule ^([^Z]*)Z(.*)$ $1z$2

    # If there are any uppercase letters, restart at very first RewriteRule in file.
    RewriteRule [A-Z] - [N]

    RewriteCond %{ENV:HASCAPS} TRUE
    RewriteRule ^/?(.*) /$1 [R=301,L]

    </IfModule>
    ## Конец модуля mod_rewrite
  124. Виктор
    Виктор 15.02.2021 Ответить

    1. домен закрывается слешем, тут без вариантов
    2. Если у вас в урле есть URL с гет параметром то его перенаправляют по другому
    3. А вотредирект регистров в урлах делать НЕЛЬЗЯ !!!!!
    
    
    RewriteEngine On
    
    RewriteRule ^$ /? [L,R=301] 
    # удалить удалить гет апарметры если это главная.
    
    RewriteBase /
    ##Корневая директория конец
    
    ############################################################################
    #### Выбор основного зеркала (с www или без www)                        ####
    ############################################################################
        # 1. Удалить 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]
    
    
    ############################################################################
    #### Перенаправляем протокол http на https                              ####
    ############################################################################
    RewriteCond %{HTTPS} (off|!on)
       # Проверяем наличие https в URL.
    RewriteCond %{REQUEST_URI} !^/bitrix/admin/1c_exchange\.php$ [NC] 
       #  Исключим обмен с 1С, ему требуется только 200 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
       # Перенаправляем протокол на http.
    
    
    ############################################################################
    #### Убираем 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                              ####
    ############################################################################
    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]
       # Добавляем слеш в конце.
    
    
    
    
    ############################################################################
    #### Компрессия статического контента для гугл  спид тест               ####
    ############################################################################
    
      AddType image/svg+xml .svg
      AddOutputFilterByType DEFLATE image/svg+xml  
      AddOutputFilterByType DEFLATE application/rss+xml
      AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
      AddOutputFilterByType DEFLATE application/x-font
      AddOutputFilterByType DEFLATE application/x-font-opentype
      AddOutputFilterByType DEFLATE application/x-font-otf
      AddOutputFilterByType DEFLATE application/x-font-truetype
      AddOutputFilterByType DEFLATE application/x-font-ttf
      AddOutputFilterByType DEFLATE application/x-javascript
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE font/opentype
      AddOutputFilterByType DEFLATE font/otf
      AddOutputFilterByType DEFLATE font/ttf
      AddOutputFilterByType DEFLATE image/svg+xml
      AddOutputFilterByType DEFLATE image/x-icon
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE text/javascript
      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE image/svg+xml
    
    
      ExpiresActive on
      ExpiresByType image/jpeg "access plus 1 year"
      ExpiresByType image/svg "access plus 1 year"
      ExpiresByType image/gif "access plus 1 year"
      ExpiresByType image/png "access plus 1 year"
      ExpiresByType text/javascript "access plus 1 year"
      ExpiresByType text/css "access plus 1 year"
      ExpiresByType application/javascript "access plus 1 year"
      ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
      ExpiresByType application/x-font-ttf "access plus 1 year"
      ExpiresByType application/x-font-opentype "access plus 1 year"
      ExpiresByType application/x-font-woff "access plus 1 year"
      ExpiresByType image/svg+xml "access plus 1 year"
    
      
      
        Header set Cache-Control "max-age=31536000, public"
      
      
        Header set Cache-Control "max-age=7200, private, must-revalidate"
      
      
        Header set Cache-Control "max-age=86400, public"
      
      
        Header set Cache-Control "max-age=31536000, private"
      
      
    ############################################################################
    #### Конец общей части, далее следует собственные директивы .htaccess   ####
    ############################################################################
    
    
    
    
    Redirect 301 /home https://besttransfer.ru
    
    
    RewriteCond %{QUERY_STRING} ^from=webmaster$ [NC]
    RewriteRule ^$ /? [R=301,L]
    
    
    RewriteCond %{QUERY_STRING} (^|&)start\=30($|&)
    RewriteRule ^blog$ /blog? [L,R=301]
    
    
    # в строке HTTP-запроса отлавливаем запрос вида /?\d*
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?\d*\ HTTP/
    # и делаем редирект на корень сайта с удалением GET переменных (знак вопроса ОБЯЗАТЕЛЕН)
    RewriteRule ^ https://besttransfer.ru/? [R=301,L]
    
    
    
    
    
    
  125. Виктор
    Виктор 15.02.2021 Ответить
    RewriteRule ^patriot/kompressory\-maslenye\-i\-bezmaslenye/kompressor\-patriot\-wo\-10120\-bezmaslyanyj\-650\-vt\-220\-v\-vyhod\-bystrosem/$ /patriot/kompressory\-maslenye\-i\-bezmaslenye/kompressor\-patriot\-wo\-10120\-bezmaslyanyj\-650\-vt\-220\-v\-vyhod\-bystrosem/? [L,R=301]
    Как-то так?
  126. Игорь 05.02.2021 Ответить
    Здравствуйте!

    Помогите пожалуйста с двумя задачами.

    Первая:

    https://www.site.ru/папка из постоянно меняющихся символов типа Xforew7/tovar.html

    Не могу перевести на урл вида https://www.site.ru/tovar.html

    Вторая:

    https://www.site.ru/tovarTOVAR.html

    или

    https://www.site.ru/tovarVkD7.html

    Дополнительные символы к адресу tovar.html постоянно меняются на произвольные комбинации.

    Не могу перевести на урл вида https://www.site.ru/tovar.html

    Есть вот такое решение

    RewriteCond %{THE_REQUEST} ^.*/.*?[A-Z].html
    RewriteRule ^(.*).*?[A-Z]\.html$ https://www.site.ru/$1? [R=301,L]

    но оно лишь ставит лишние символы в конец урла tovar.html, то есть получается tovar.htmlVkD7

    Подскажите пожалуйста как решить такие задачи. Заранее, Спасибо!
  127. Виктор
    Виктор 15.02.2021 Ответить
    # 301 --- https://www.site.ru/Xforew7/tovar.html => https://www.site.ru/tovar.html
    RewriteRule ^.+/tovar\.html$ /tovar.html? [L,R=301]
    

    и если люой из html файлов

    RewriteRule ^.+/(.+\.html)$ /$1? [L,R=301]

    # 301 --- https://www.site.ru/tovarTOVAR.html => https://www.site.ru/tovar.html
    RewriteRule ^tovar[A-Z]{1,}\.html$ /tovar.html? [L,R=301]
    

    И если любой файл
    RewriteRule ^(.+)[A-Z]{1,}\.html$ /$1.html? [L,R=301]
    

    А в этом варианте полуится тольок зная полностю название товара
    # 301 --- https://www.site.ru/tovarVkD7.html => https://www.site.ru/tovar.html<
    RewriteRule ^tovar.+\.html$ /tovar.html? [L,R=301]
    
  128. Виктор 11.02.2021 Ответить
    Здравствуйте, помогите пожалуйста.
    Есть сайт, на нем ссылки по сайту выглядят так href="сайт.ру/каталог/товар", но он не открывает его, потому что по факту должно быть href="сайт.ру/каталог/товар.html". Раньше я легко справлялся с этой проблемой, прописав в htacces такие строчки:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME}\.html -f
    RewriteRule ^(.*)$ $1.html
    Я бы и дальше это использовал, но я боюсь что поисковик на это плохо отреагирует.
    Как можно заменить этот код правильно, чтобы поисковик ничего не подумал на меня плохого?
  129. Виктор
    Виктор 15.02.2021 Ответить
    Не достаточно информации.
    Зачем вам вообще добавлять html ? чем короче ссылка тем лучше тем более добавление расширения в ней не несет никакой смысловой нагрузки.
    Тем более насколько я понимаю эти странички у вас генерируются ЧПУ сайта.

    Самый правильный вариант за ЧПУ отвечает ЧПУ сайта уж простите за тавтологию, оно и должно этим заниматься.

    Расскажите более подробно что за движок зачем вам html и будет понятно что конкретно вам порекомендовать.

  130. Александр 12.03.2021 Ответить
    Здравствуйте!
    Помогите пожалуйста разобраться с проблемой.
    Необходимо убрать ?id= " https://domain.ru/?id= " чтобы получилось " https://domain.ru/ " и в таком варианте " https://domain.ru/?id=раздел сайта " чтобы получилось " https://domain.ru/раздел сайта "

    И еще есть проблема https://domain.ru/?dfsdfsiom=webmaster и https://domain.ru/?ifom=webmaster после / убрать символы, чтобы получилось https://domain.ru/ , вообще можно как то убрать " ? "и после него лишние символы, много дублей из-за него!
  131. Виктор
    Виктор 01.05.2021 Ответить
    Да Get параметр можно убрать, но как правило тем что вы говорите должно заниматься ЧПУ сайта подробней о этой теме можно поискать "как сделать ЧПУ сайта" ну или если у вас cms то там есть свой.
    если же вам нужно сделать именно в .htaccess то

    Так удалить чпу
    RewriteCond %{QUERY_STRING} (?:^|&)id\=.+(?:$|&)
    RewriteRule ^.*$ /? [L,R=301]

    а вот так передать часть GET в RewriteRule

    RewriteCond %{QUERY_STRING} (?:^|&)id\=(.+)(?:$|&)
    RewriteRule ^.*$ /%1/? [L,R=301]
    где %1 это первая группа из %{QUERY_STRING}
    а первая она потому что в первой и 3 группе есть ?: - то есть исключить эту группу из выбора. Короче попадает в первую группу значение айди
    если же вам нужно сгрупировать что-то еще и RewriteRule то там классические $1
  132. Иван 10.03.2021 Ответить
    Доброго! Подскажите пожалуйста. А как сделать редирект страниц со знаком вопроса в конце урла http://site.ru/stranica? на страницу без знака вопроса http://site.ru/stranica . Сайт на джумле и виртуалмарте3. Заранее благодарен.
  133. Виктор
    Виктор 02.05.2021 Ответить
    это нужно делать не в .htaccess а в движке сайта
    GET параметр выделяется через
    RewriteCond %{QUERY_STRING}
    а в
    RewriteRule гет параметры вообще не попадают по этому тут нечего просто выделить, если же вам нужно удалить все гет параметры то просто в куда укажите
    /? на конце так удалятся все параметры.

  134. Renat 17.03.2021 Ответить
    Здравствуйте! Подскажите пожалуйста!
    К сайту привязано два домена типа test1.ru и test1.com
    Настроены перенаправления обоих доменов на www.test1.ru и www.test1.com
    Как можно прописать автоматическое перенаправление на https только для сайта с доменом www.test1.ru к которому подключен сертификат безопасности? Если применить общее правило, то оно срабатывает сразу для обоих доменов.
    Код:
    RewriteCond %{HTTP_HOST} ^test1\.ru$ [NC]
    RewriteRule ^(.*)$ http://www.test1.ru/$1 [L,R=301]

    RewriteCond %{HTTP_HOST} ^test1\.com$ [NC]
    RewriteRule ^(.*)$ http://www.test1.com/$1 [L,R=301]
  135. Виктор
    Виктор 02.05.2021 Ответить
    У вас в примере не хватает данных я не вижу тут отдельного правила для перенаправленный
    но если исходя из вашего примера то так :
    RewriteCond %{HTTP_HOST} ^test1\.ru$ [NC]
    RewriteRule ^(.*)$ https://www.test1.ru/$1 [L,R=301]

    RewriteCond %{HTTP_HOST} ^test1\.com$ [NC]
    RewriteRule ^(.*)$ http://www.test1.com/$1 [L,R=301]

    Однако не забывайте что если эти сайт расположены на одном сервере то нет технической возможности установить сертификат только на одном сайте, так или иначе все сайты на этом серврвере получат сертификаты, отключить их физически не возможно!
    Вы обязаны будете выдать всем сертификаты, пусть они даже будут самоподписанные или letsencrypt
    Связано это с костылем который обходит ограничения tcp\ip
    как мы пониаем сайты по RFC должны были бы иметь отдельный или айпи или порт, но мы не наблюдаем ни того ни другого.
    А следовательно разграничение идет каким-то костылем, в данном случае apach лезет в рефер вашего браузера и смотрит на строку хост, именно браузера.
    И на основание этой строки он подставляет нужный конфиг.
    Но это работало на http
    Теперь же когда https у вас уже открыт порт и он не связан с сайтом он уже открыт и уже слушается
    проблема в рефери поскольку как вы думаете при ключах что в начале будет
    контент по каналу в котором он получает нужный рефер в котором будет нужная перемеренная хост, или он вначале потребует ключи от этого канала?
    Правильно он в начале потребует ключи а не сможет их получить поскольку нет рефера, в результате апачь сделает следующее.
    Он возьмет ближайшие ключи которые сможет найти в конфиге ( по убыванию то есть с конфига начинающегося например цифры 0 или с буквы а. Возьмет его ключи подставит и считает рефер, однако в это время у него уже будет подставлен весь конфиг сайта.
    В результате у вас все домены будут открывать контент того сайта конфиг которого он взял для ключей.
    В общем выдавайте всем сайтам сертификаты притом желательно зеленые пусть даже letsencrypt и уже если один из сайтов не должен быть доступен по https то перенаправляйте его на 403 код
  136. Александр 01.05.2021 Ответить
    Здраствуйте. Н могу понять убрать промежуточную папку. Хочу привести к виду:
    https://domain.ru/opne/open.html -> https://domain.ru/open
    https://domain.ru/close/close.html -> https://domain.ru/close
    https://domain.ru/fin/fin.html -> https://domain.ru/fin
    Я бы обошелся простым решением скрыть .html и разместить все файлы в корне сайта, но для сео необходимо древо.
  137. Виктор
    Виктор 02.05.2021 Ответить
    1 переименуйте все файлы в index.html я так понимаю там по 1 файлу в каждой папке
    2. если у вас нет директивы то пропишите в .htaccess
    DirectoryIndex index.html index.htm index.php
    где последовательность говорит какой из них будет открываться первым в данном случае вначале при наборе урла https://domain.ru/open
    автоматически попытается открыть index.html
  138. Виталий 04.05.2021 Ответить
    Здравствуйте!
    СМS Wordpress создает дубли страниц.
    Есть страница категории https://site.com/product-category/product/

    Дубль https://site.com/product-category/asdhr/product/
    Дубль https://site.com/asdhr/product-category/product/
    Дубль https://site.com/product-categoryasdhr/product/

    при этом /asdhr/ меняется постоянно и в следующую проверку дубли может быть dgааfh.
    Некоторые такие страницы отдают код 200
    А некоторые переадресовываются 301 на совсем другую страницу https://site.com/razdel/product2/
    Нужно чтоб эти дубли делали 301 на свою категорию https://site.com/product-category/product/
    Идеально было бы общее правило, которое подойдет и для других категорий, т.к. их несколько.
    В сети по этому поводу ничего найти не могу. Буду благодарен за ответ. Спасибо.
  139. Виктор
    Виктор 10.05.2021 Ответить
    Насколько я знаю в wp есть множество сео инструментов вам нужно их изучить возможно что-то доставить.
    Если есть категории то лучше это делать через движок чем через регулярки.
    Если же такой возможности нет то нужен файлик со всеми ссылками было стало
  140. Виталий 10.05.2021 Ответить
    На сегодня, почти все дубли удалось победить.
    Остался только дубль https://site.com/product-category/asdhr/product/ с каждый раз разными символами.
    То есть он всегда встраивается между /product-category/ и /product/
    Хуже всего, что такой урл отдает код 200 и по хорошему ему нужно сделать 301 или 404
    Может есть какой-то вариант его убрать между этих разделов?
  141. Виктор
    Виктор 11.05.2021 Ответить
    RewriteRule ^product\-category/(.+)/product/$ /product\-category/product/? [L,R=301]
    Можно было бы начать от этого, но что является категорией знает только ваша CMS и тем более товаром.
    Так что это или большое количество правил ( что тоже возможно) или средствами движка.
  142. Сергей 20.06.2021 Ответить
    Скажите пожалуйста, как из адреса вырезать www. а остальные поддомены третьего уровня перенести в конец за слеш?
    Например адрес https://www. exam.site.ru перенаправить на https://site.ru/exam
  143. Виктор
    Виктор 22.06.2021 Ответить

    RewriteCond %{HTTP_HOST} ^www\.([^\.]+)\.([^\.]+)\.([^\.]+$) [NC]
    RewriteRule ^(.*)$ https://%2.%3/%1/$1 [R=301,L]

    RewriteCond %{HTTP_HOST} !^www\.[^\.]+\.[^\.]+$ [NC]
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.([^\.]+)\.([^\.]+$) [NC]
    RewriteRule ^(.*)$ https://%2.%3/%1/$1 [R=301,L]

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