Preservar o protocolo HTTP / HTTPS nos redirecionamentos do .htaccess

Eu tenho que redirect a porta 80 para 2368 no htaccess, mas gostaria de manter o protocolo solicitado intacto para que o SSL não quebre.

Eu atualmente tenho isso:

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] RewriteRule ^ http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 

que funciona corretamente, mas eu gostaria que o protocolo fosse retirado da condição% {HTTP_HOST}, se possível.

Existe uma maneira de obter isso para ser mais dynamic sem domínios e protocolos de codificação rígidos?

Parece muito lento como é.

Tente adicionar uma condição como:

 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTPS}:s on:(s) 

Que verifica se o HTTPS está desativado ou está ativado e você pode usar uma referência anterior para buscar o caractere “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] 

Portanto, se o HTTPS estiver desativado, %1 estará em branco e o protocolo será http:// . Se HTTPS estiver ligado, o “s” é agrupado e a referência anterior %1 é “s”, portanto, o protocolo é https:// .

No entanto, isso é tudo assumindo que a porta 2368 pode manipular tanto o não criptografado quanto o SSL / TLS.

O truque fornecido por Jon é um hack legal, mas temo que ele possa quebrar se você quiser usar mais condições [OR] , e se você usar mais referências anteriores, você deve ter cuidado com o número a ser usado ( %1 ou %2 ou ..).

Acho que a solução mais elegante, robusta e limpa para o manuseio inteligente de HTTP / HTTPS é definir uma variável:

 # 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] 

A vantagem também é que o código de boot precisa ser executado apenas uma vez, portanto, se você tiver mais regras de reescrita, o código resultante será muito mais curto e elegante.

Observe que uma configuração comum é https fornecida com o cloudflare, em cujo caso o HTTPS não está ‘ligado’ no próprio servidor. Nesse caso, você precisa de regras extras como (pedido de nota):

 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] 

A partir do Apache 2.4 você também pode usar a variável %{REQUEST_SCHEME} para preservar o esquema:

 RewriteRule "^" "%{REQUEST_SCHEME}://sub.domain.com:2368%{REQUEST_URI}" [P,QSA,L] 

Não há necessidade de se meter com quaisquer condições dessa maneira.

Ou você pode usar a solução postada como uma resposta por Jon Lin e reescrevê-la para usar um RewriteCond e então definir uma variável como sugerido na resposta pelo TMS .

Isso ficaria assim:

 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] 

Ou, se preferir:

 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]