
Tengo una aplicación con su servidor en varios dominios (cada uno personaliza la apariencia de la aplicación).
Además, hay un dominio común que tiene varios subdominios para mostrar los mismos datos que antes.
Entonces - www.apples.com
parece lo mismo queapples.efruit.co.uk
y - www.bananas.co.uk
aparece igual quebananas.efruit.co.uk
etc.
Ahora, tengo un ssl comodín para el dominio efruit.co.uk, por lo que quiero usar el archivo htaccess para forzar que todas las solicitudes de efruit.co.uk usen https (si aún no lo están haciendo).
Todos los demás dominios no tendrán SSL, por lo que deberán usar http para evitar advertencias del navegador, nuevamente desde el archivo htaccess.
También me gustaría utilizar el archivo htaccess para que, si alguien escribe www.apples.efruit.co.uk, lo reescriba como apples.efruit.co.uk (a través de https como se indica arriba). Sin embargo, www. está bien si no es un dominio efruit.co.uk.
Finalmente, tengo la regla de reescritura estándar y bien documentada para codeigniter para hacer la URL más bonita.
Esto es lo que tengo hasta ahora.
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
# block hidden directories
RewriteRule "(^|/)\." - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
Sin embargo, lo único que parece funcionar es obligar a los dominios efruit.co.uk a servirse a través de https.
Respuesta1
Parece que está detrás de un proxy SSL (?), de ahí el uso del X-Forwarded-Proto
encabezado de solicitud, en lugar de la HTTPS
variable del servidor.
RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Si bien indica que este bit "funciona" ("forzar que efruit.co.uk
los dominios se proporcionen a través de https"), esto no redirigirá el dominio principal y también mantendrá el subdominio www, si está presente en la solicitud; primero debe eliminarlo para Evite una redirección secundaria. Por tanto, es necesario un cambio en el orden de estas directivas.
Tampoco necesita un grupo de captura (es decir, un subpatrón entre paréntesis) a menos que tenga la intención de utilizarlo como referencia, lo cual no parece serlo.
Todos los demás dominios no tendrán SSL, por lo que deberán usar http para evitar advertencias del navegador, nuevamente desde el archivo htaccess.
No puede emitir una redirección de HTTPS a HTTP .htaccess
para evitar la advertencia del navegador en estos otros dominios, que parece ser lo que está sugiriendo. Porque el certificado SSL no válidoadvertencia del navegadorocurreantes .htaccess
es ejecutado. El protocolo de enlace SSL se produce al comienzo de la solicitud.
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Por lo tanto, lo anterior en realidad no se ejecutará desde un navegador, a menos que el usuario acepte la advertencia del certificado SSL (lo cual no debería hacer).
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
Esto .htaccess
daría como resultado una redirección no válida, para cualquier cosa que no sea la raíz del documento, porque la $1
referencia inversa no tiene un prefijo de barra diagonal. Incluso para la raíz del documento, debería incluir una barra diagonal al finalsustitución(aunque el navegador solucionará esto implícitamente). Además, ¿tiene curiosidad por saber por qué utilizó la REQUEST_URI
variable del servidor en las dos primeras reglas, pero utilizó una referencia inversa aquí?
Pruebe algo como lo siguiente en su lugar:
# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]
# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]
# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Otras notas:
- No es necesario utilizar una barra invertida para escapar de un punto literal cuando se usa dentro de una clase de caracteres.
- Quité el
$
final del ancla de cadena en la verificación del host para detectar el FQDN que incluye un punto final. - Probablemente quieras cambiar estos redireccionamientos permanentes (301) una vez que hayas confirmado que funcionan correctamente. es decir. cambiar
R
aR=301
.