Меню

Преобразование верхнего регистра в нижний в htaccess

Создание сайтов8677

Здравствуйте, любимые читатели моего блога. Из этого материала вы узнаете, как избавиться от дублей, касающихся регистра в url.

Использование htaccess для преобразования верхнего регистра в нижний

Этот код должен находиться в самом верху файла .htaccess. Или, по крайней мере, располагаться выше любой директивы RewriteRules. Причиной этому является использование цикла: пока нет символов верхнего регистра для преобразования, код будет запускаться каждый раз с первой строки HASCAPS:TRUE в директиве RewriteRule. На самом деле, это работает быстро и не приводит к какому-либо замедлению.

RewriteEngine On
RewriteBase /
# Если есть прописные буквы, установить HASCAPS в true и пропустить следующее правило
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
# Пропустить этот раздел в случае, если в URL нет букв в верхнем регистре
RewriteRule ![A-Z] - [S=28]
# Заменить одно вхождение слова "CAP" на "cap" и перейти к следующему правилу.
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
# Если есть буквы в верхнем регистре, начать заново с самого первого RewriteRule в файле.
RewriteRule [A-Z] - [N]
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]

Использование RewriteMap в httpd.conf

Самый быстрый способ. Этот код необходимо поместить в файл httpd.conf, а не .htaccess

RewriteEngine on
RewriteBase /
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]

Использование mod_speling в httpd.conf

Третий способ - включение встроенного в apache модуля mod_speling. Лично я не использую его, но многие используют.

CheckCaseOnly On
CheckSpelling On

Надеюсь, эта статья была полезна. Буду благодарен за вопросы и мнения об этом: интересно, считаете ли вы действия, описанные в статье, важными? Я считаю, что да.

С уважением, Денис Скрипник.

Текущая оценка Общий бал: 3 Проголосовало Проголосовало: 2

help_share

Данная публикация была вам полезна?

Помоги автору сайта, расскажи друзьям...

Комментариев: 9
  •  Дмитрий | 6 ноября 2015 в 07:33:29
    img

    Доброй ночи! воспользовался вашим кодом, но он помог только на страницах второго уровня, на страницах 3-го уровня к сожалению не работает! подскажите есть ли решение?

    •  Денис Скрипник | 11 ноября 2015 в 10:47:58
      img

      Здравствуйте. Пока нет. Если вы про url третьего уровня - проблем не видел.

  •  людмила | 20 февраля 2017 в 18:45:03
    img

    Как сделать такой редикт 301 ?

    Технические дубли.

    Необходимо настроить 301 редирект по такому правилу для всех страниц сайта:

    со страниц содержащие в конце index.php должен быть настроен 301 редирект на такую же без него

    пример:

    http://мой сайт/knopki-krepezh/knopki-pereklyuchateli-tumblery/index.php

    редирект на

    http://мой сайт/knopki-krepezh/knopki-pereklyuchateli-tumblery

    тоже самое и для страниц содержащих .html и .htm

    •  Денис Скрипник | 20 февраля 2017 в 23:16:29
      img

      Здравствуйте. Вы создали сайт на каком движке (CMS)? Вам надо, чтобы с любой страницы + index.php/index.html шло перенаправление на основной адрес или только на главной?

  •  людмила | 21 февраля 2017 в 20:17:25
    img

    сайт/раздел/подраздел что было без index php

    •  Денис Скрипник | 21 февраля 2017 в 21:34:41
      img

      Работаем с .htaccess.

      После строки

      RewriteBase /

      добавляете:

      RewriteCond %{REQUEST_METHOD} =GET

      RewriteCond %{REQUEST_URI} ^(.*)index\.php$

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

      Правда после этого придётся удалить при помощи специального кода косую черту, иначе дубль будет. Убрать её не смог.

  •  людмила | 22 февраля 2017 в 00:25:23
    img

    спасибо, но после так выглядит

    http://мой сайт.com//?_route_=knopki-krepezh/knopki-pereklyuchateli-tumblery

    •  Денис Скрипник | 22 февраля 2017 в 01:23:28
      img

      Пожалуйста. Видимо от конфигурации сервера зависит: у меня слеш лишний в конце добавляется, а у вас - после домена.

  •  Kind | 25 февраля 2017 в 18:45:51
    img

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

    То есть при виде URL-адреса:

    site.ru/Page

    Происходит редирект на:

    site.ru/page/

    При наличии двух и т.п. заглавных букв, добавляется два и более слеша:

    при site.ru/PaGE

    Происходит редирект на:

    site.ru/page///

    На моем сайте стоит редирект на вариант страниц со слешем в конце и при использовании вашего кода у меня происходит цепочка редиректов:

    с site.ru/PaGE/ на site.ru/page/// и потом на site.ru/page/.

    Подскажите пожалуйста, знаете ли вы варианты устранения цепочки редиректов в этом случае?

Буду благодарен за каждый оставленный вами комментарий

Добавить Комментарий

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Похожие публикации