Как объединить 2 условия для редиректа (без www и на https) в одно правило в htaccess?

Привет!

Пытаюсь настроить два редиректа:

1. с http -> на https
2. с www -> без www

Т.е.:
- www.site.ru/?param=val -> https://site.ru/?param=val
- site.ru/?param=val -> https://site.ru/?param=val
- https://www.site.ru/?param=val -> https://site.ru/?param=val

Но получается настроить только в виде 2х отдельных правил, каждое из которых отвечает за свое:
# HTTPS
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

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


Если попытаться объединить их в одно, чтобы в любом случае делался только один редирект, то в зависимости от последней строки работает что-то одно - либо форсирование https, либо www.

RewriteCond %{SERVER_PORT} !^443$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

    # работает только www (При соединении с сайтом http://site.ru/ произошло нарушение сетевого протокола, которое не может быть устранено.)
    # RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

    # работает только HTTPS (При соединении с www.site.ru произошла ошибка. Эта проблема может возникать при отключении или запрещении принятия кук.)
    # RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]


Есть возможность объединить эти условия или нет?
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 2
shambler81
@shambler81 Куратор тега htaccess
не нужно, уже много раз обсуждали.
Ответ написан
Комментировать
@dodo512
Есть несколько вариантов.

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


RewriteCond %{SERVER_PORT} !^443$ [OR]
RewriteCond %{HTTP_HOST}   ^www\. [NC]
RewriteCond %{HTTP_HOST}   ^(?>www\.|)(.+) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]


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


RewriteCond %{SERVER_PORT}%{HTTP_HOST} ^(?|443www\.(.+)|80(?>www\.|)(.+)) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы