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] 
# перенаправляет все урлы на главную
Перенаправление robots.txt на robot.php
 RewriteCond %{REQUEST_FILENAME} robots.txt
 RewriteCond %{DOCUMENT_ROOT}/robots.php -f
 RewriteRule ^(.*)$ /robots.php [L]

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

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

  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 добавляется или ошибка сервера, синтаксиса.
  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
    
    

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