.htaccess - htaccess - redirect http to https iis
Preserve el protocolo HTTP/HTTPS en.htaccess redirects (4)
Tengo que redirigir el puerto 80 a 2368 en htaccess, pero me gustaría mantener intacto el protocolo solicitado para que SSL no se rompa.
Actualmente tengo esto:
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
RewriteRule ^ http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L]
que funciona correctamente, pero me gustaría que el protocolo se tome de la condición% {HTTP_HOST} si es posible.
¿Hay alguna manera de hacer que esto sea más dinámico sin los dominios y protocolos de codificación?
Parece muy lento como es.
Comenzando con Apache 2.4 también puede usar la variable %{REQUEST_SCHEME}
para preservar el esquema:
RewriteRule "^" "%{REQUEST_SCHEME}://sub.domain.com:2368%{REQUEST_URI}" [P,QSA,L]
No hay necesidad de interferir con las condiciones de esta manera.
El truco proporcionado por Jon es un buen hack, pero me temo que podría romperse si quieres usar más [OR]
condiciones, y si utilizas más referencias retrospectivas debes tener cuidado con qué número usar ( %1
o %2
o ..).
Creo que la solución más elegante, robusta y limpia para el manejo inteligente de HTTP / HTTPS es establecer una variable:
# 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]
La ventaja también es que el código de inicialización debe ejecutarse solo una vez, por lo que si tiene más reglas de reescritura, el código resultante es mucho más corto y más elegante.
Tenga en cuenta que una configuración común es https proporcionada con cloudflare, en cuyo caso HTTPS no está ''on'' en el servidor mismo. En ese caso, necesita reglas adicionales como (orden de notas):
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]
Intente agregar una condición como:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s)
Lo que comprueba si HTTPS está desactivado o está activado y puede usar una referencia posterior para recuperar el carácter "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]
Entonces, si HTTPS está desactivado, %1
está en blanco y el protocolo es http://
. Si HTTPS está activado, entonces la "s" está agrupada y la referencia inversa %1
es una "s", por lo tanto, el protocolo es https://
.
Sin embargo, todo esto supone que el puerto 2368 puede manejar tanto sin cifrar como SSL / TLS.
O bien, puede usar la solución publicada como respuesta de Jon Lin y volver a escribirla para usar una RewriteCond
y luego establecer una variable como se sugiere en la respuesta de TMS .
Eso se vería así:
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]
O, si lo prefiere:
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]