Подтвердить что ты не робот

Сохранять протокол 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}, если это возможно.

Есть ли способ сделать это более динамичным без жестких доменов и протоколов кодирования?

Это кажется очень медленным, как есть.

4b9b3361

Ответ 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]