@ua30

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

Добрый день!

Есть .htaccess с такими правилами:

# на https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# c www на без www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

# без многократных слешей
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]

# в нижнем регистре
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]


Если запрос подпадает под несколько правил, может выполняться несколько последовательных редиректов. Например, в самом худшем случае будет:

1. Редирект на https;
2. Редирект на без www + без повторяющихся слешей;
3. Редирект на url в нижнем регистре.

Можно это как-то сделать одним редиректом?
  • Вопрос задан
  • 653 просмотра
Пригласить эксперта
Ответы на вопрос 2
1. очень просто, этого делать не нужно, последовательные коды это нормальное явление, да лучше этого не делать, но по факту от них никуда не деться и яндекс и гугл с легкостью их видят.
2. сложность такого редиректа вырастет и притом в стппени количества свобод ( мат часть)
то есть если я вам его напишу вы все-равно не сможиите с ним уже потом что-то сделать.
3. # в нижнем регистре - дайте в рожу тому кто предложыл сделать этот идиотский редирект, линукс регистрозависимая система, в отличие от виндовс, и такие идиотские редиректы в нем делать: А нет смысла, Б нельзя.
(тут поясню)
Вам нужно будет делать условия что это не файл не ссылка не директория, и только при таком условие менять регистр, в противном случае вы рискуете у Image.jgp получить 404
НО по сути у вас останутя только те урлы которые делает ЧПУ сайта, а это уж простите нужно настроить адекватно ЧПУ на сайте вот и все, не нужно страдать ..йней.
Если же вы боитесь сделать неправильный редирект то установите флаг [NC]
Формирование же ЧПУ на совести движка, лезть в него идиотскими редиректами это верх криворукости.
4. .htaccess читается сверху вниз и если вы хотите сделать редирект на ввв и он сразу https то поставьте его выше частного случая редиректа на htttps в таком случае вы получите редирект и ввв и https сразу ;), переместив его ниже у вас действительно будет два редиректа.
два слеша норм НО опять же конструкция разрастется в количество раз степени свободы, а следоватлеьно это уже минимум строк 20
Ответ написан
Комментировать
@dodo512
1. Редирект на https;
2. Редирект на без www + без повторяющихся слешей;

RewriteCond %{THE_REQUEST} //     [OR]
RewriteCond %{HTTPS}       off    [OR]
RewriteCond %{HTTP_HOST}   ^www\. [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Или так:
RewriteCond %{THE_REQUEST} //     [OR]
RewriteCond %{HTTPS}       off    [OR]
RewriteCond %{HTTP_HOST}   ^www\. [NC]
RewriteCond %{HTTP_HOST}   ^(?:www\.|)(.+) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]


Или даже без флага [OR]
RewriteCond %{HTTPS};%{HTTP_HOST};%{THE_REQUEST} !^on;(?!www\.)[^;]+;(?!.*//) [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.|)(.+) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]


Можно и в один RewriteCond всё запихнуть.
RewriteCond %{HTTP_HOST};%{HTTPS};%{THE_REQUEST} ^(?=(?:www\.|)([^;]+))(?!(?!www\.)[^;]+;on;(?!.*//)) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы