Как правильно задать несколько пересекающихся условий RewriteRule в .htaccess?

Есть сайт site.ru. На него прошлой осенью я получил сертификат с ныне нелюбимого производителями браузера startssl.com. Сертификат установил, проверил, что при ручном наборе с https не осталось смешанного контента и оставил так до зимы. Сейчас в свете грядущей версии хрома решил, что пора бы уже выставить https основным, но наткнулся на неприятную проблему: все попавшие в руки Android смартфоны сертификату моему не доверяли (Nougat не проверял). Пытаюсь сделать перенаправление при помощи .htaccess по следующим трём условиям:
1) Если сайт указан с поддоменом - перебросить на сайт без домена. То есть www.site.ru -> site.ru
2) Если по %{HTTP_USER_AGENT} я считаю, что посетитель с телефона - оставить ту версию сайта, которую он набрал. Ну, или можно перенаправить на http.
3) Если по %{HTTP_USER_AGENT} я считаю, что посетитель не с телефона - принудительно перенаправить на https.

В общем, у меня не получается совместить первое условие с остальными двумя. Либо не происходит обрезания www., либо я получаю ошибку Слишком много перенаправлений. Одна из последних попыток:

#Русские буквы я не использовал на сервере.
#Первое условие. Работает само по себе, не работает со следующим:
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^site\.ru [NC]
RewriteRule (.*) https://site.ru/$1 [R=301,L]
#Другие попытки:
#RewriteRule ^(https?)\:\/\/([a-z0-9\-\.]*)(.*)$ https://site.ru/$3 [R=301,L]
#RewriteRule (.*) https://site.ru%{REQUEST_URI}

#Второе и третье условия:
RewriteCond %{SERVER_PORT} !^443
RewriteCond %{HTTP_USER_AGENT} !(?i:samsung|iphone|android)
RewriteRule (.*) https://site.ru/$1 [R=301,L]
#Другая попытка:
#RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]


UPD:
нашёл такой вариант, завтра проверю, как он будет работать совместно с проверкой UserAgent
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule (.*) https://site.ru/$1 [L,R=301]
  • Вопрос задан
  • 2215 просмотров
Решения вопроса 1
Sabin
@Sabin Автор вопроса
Похоже, что для RewriteRule нельзя допускать ситуаций, когда сразу 2 условия подходят. В данный момент написал так:
#Desktop HTTP and WWW
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^site\.ru [NC]
RewriteCond %{HTTP_USER_AGENT} !(?i:samsung|iphone|android) [NC]
RewriteRule (.*) https://site.ru/$1 [L,R=301]

#Desktop HTTP
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^site\.ru [NC]
RewriteCond %{HTTP_USER_AGENT} !(?i:samsung|iphone|android) [NC]
RewriteRule (.*) https://site.ru/$1 [L,R=301]

#Desktop HTTPS and WWW
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^site\.ru [NC]
RewriteCond %{HTTP_USER_AGENT} !(?i:samsung|iphone|android) [NC]
RewriteRule (.*) https://site.ru/$1 [L,R=301]

#mobile WWW
RewriteCond %{HTTP_HOST} !^site\.ru [NC]
RewriteCond %{HTTP_USER_AGENT} (?i:samsung|iphone|android) [NC]
RewriteRule (.*) http://site.ru/$1 [L,R=301]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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