Задать вопрос
@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 в нижнем регистре.

Можно это как-то сделать одним редиректом?
  • Вопрос задан
  • 784 просмотра
Подписаться 2 Простой Комментировать
Ответ пользователя dodo512 К ответам на вопрос (2)
@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]
Ответ написан