archivo htaccess para realizar reglas específicas para diferentes dominios

archivo htaccess para realizar reglas específicas para diferentes dominios

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.comparece lo mismo queapples.efruit.co.uk

y - www.bananas.co.ukaparece 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-Protoencabezado de solicitud, en lugar de la HTTPSvariable 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.uklos 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 .htaccesspara 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 .htaccesses 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 .htaccessdaría como resultado una redirección no válida, para cualquier cosa que no sea la raíz del documento, porque la $1referencia 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_URIvariable 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 Ra R=301.

información relacionada