Сохранять протокол HTTP/HTTPS в перенаправлении .htaccess
Мне нужно перенаправить порт 80 на 2368 в htaccess, но я хотел бы сохранить запрошенный протокол неповрежденным, чтобы SSL не прерывался.
В настоящее время у меня есть это:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
который работает правильно, но я хотел бы, чтобы протокол был взят из условия% {HTTP_HOST}, если это возможно.
Есть ли способ сделать это более динамичным без жестких доменов и протоколов кодирования?
Это кажется очень медленным, как есть.
Ответы
Ответ 1
Попробуйте добавить условие вроде:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s)
Что проверяет, что HTTPS выключен или включен, и вы можете использовать обратную ссылку для получения символа "s" :
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s)
RewriteRule ^ http%1://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
Итак, если HTTPS выключен, %1
пуст, а протокол - http://
. Если HTTPS включен, тогда "s" сгруппировано, а обратная ссылка %1
- "s" , поэтому протокол https://
.
Однако все это предполагает, что порт 2368 может обрабатывать как незашифрованные, так и SSL/TLS.
Ответ 2
Трюк, предоставленный Джоном, - это хороший хак, но я боюсь, что он может сломаться, если вы хотите использовать больше условий [OR]
, и если вы используете больше обратных ссылок, вы должны быть осторожны, какой номер использовать (%1
или %2
или..).
Я думаю, что самым элегантным, надежным и чистым решением для умной обработки HTTP/HTTPS является установка переменной:
# initialization code - put only once at the beginning of .htaccess
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
# simply use %{ENV:proto} in your rules:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ %{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
Преимущество также состоит в том, что код инициализации нужно запускать только один раз, поэтому, если у вас есть больше правил перезаписи, то полученный код намного короче и элегантнее.
Обратите внимание, что общая настройка - https, снабженная облачным флагом, и в этом случае HTTPS не является 'on' на самом сервере. В этом случае вам нужны дополнительные правила, такие как (порядок заметок):
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
Ответ 3
Начиная с Apache 2.4 вы также можете использовать переменную %{REQUEST_SCHEME}
для сохранения схемы:
RewriteRule "^" "%{REQUEST_SCHEME}://sub.domain.com:2368%{REQUEST_URI}" [P,QSA,L]
Не нужно вмешиваться в какие-либо условия таким образом.
Ответ 4
Или вы можете использовать решение, отправленное как ответ Jon Lin и переписать его, чтобы использовать один RewriteCond
, а затем установить переменную как было предложено в ответе TMS.
Это будет выглядеть так:
RewriteCond %{HTTPS}s ^(on(s)|offs)$
RewriteRule ^ - [env=s:%2]
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http%{ENV:s}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
Или, если вы предпочитаете:
RewriteCond %{HTTPS}s ^(on(s)|offs)$
RewriteRule ^ - [env=proto:http%2]
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ %{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]