Как сохранить протокол при редиректе?

Задача с виду простая, сохранить протокол при ридиректа. Вот только штатного метода нет.

Дано:
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Проблема в том что ответа сервера нет htttp или https может быть off on true false но а это к делу не пришить.
Есть Vary: HTTPS
но http он вообще не возвращает.

Как вариант что-то вроде
RewriteCond %{HTTP:X-Forwarded-Proto} http(s) [NC]
#RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^331/$ /best/http%1/%2/3 [L,R=301]


с коментом работает %1 а вот со вторым кондом уже нет ;(
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
shambler81
@shambler81 Автор вопроса, куратор тега htaccess
RewriteCond %{ENV:HTTPS} on
RewriteRule .* - [E=SSL:s]
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]

спасибо всем решение нашел сам.
Если кто-то предложит что получше будем смотреть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dodo512
Как вариант что-то вроде
RewriteCond %{HTTP:X-Forwarded-Proto} http(s) [NC]
#RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^331/$ /best/http%1/%2/3 [L,R=301]

с коментом работает %1 а вот со вторым кондом уже нет ;(

Результат в %1-%9 перезаписывается последним успешным совпадением с шаблоном.
Т.е. условие с префиксом ! не затрёт результаты предыдущего.
RewriteCond %{HTTP:X-Forwarded-Proto} http(s)| [NC]
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$  http%1://www.%{HTTP_HOST}/$1 [R=301,L]


Другой способ это запихнуть оба условия в один RewriteCond.
RewriteCond "s %{HTTPS} %{HTTP_HOST}"
Тогда варианты проверяемой строки могут быть такими:
s on site.ru
s on www.site.ru
s off site.ru
s off www.site.ru


RewriteCond "s-%{HTTPS} %{HTTP_HOST}"  "^(?:(s)-on|\S+) (?!www\.)(.*)" [NC]
RewriteRule ^(.*)$ http%1://www.%2/$1  [R=301,L]


RewriteCond "s-%{HTTPS} %{HTTP_HOST}"  "^(?:(s)-on|\S+) www\.(.*)" [NC]
RewriteRule ^(.*)$     http%1://%2/$1  [R=301,L]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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