Tengo lo siguiente en mi .htaccess
archivo:
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule "(^|/)\." - [F]
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !(health_check\.php)$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
</IfModule>
Todo parece funcionar bien excepto una /sns
parte. No puedo hacer que esto deje de redirigir a https.
Me gustaría http://sub.example.com/sns
y http://sub.example.com/health_check.php
no redirigir a https.
Respuesta1
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below) RewriteCond %{REQUEST_URI} !^/(sns)/
Si la URL de solicitud no termina con una barra diagonal (como se indica), entonces la regla anterior (que incluye la barra diagonal final en laPatrónCond) siempre tendrá éxito (es unnegadocondición), por lo que la redirección a HTTPS siempre ocurrirá.
Lo ideal sería canonizar la barra diagonal al final de la solicitud. Incluya o no la barra diagonal final (de lo contrario, es esencialmentecontenido duplicadoy podría causar problemas con otros scripts que analizan la URL).
Sin embargo, para manejar las dos URL /sns
, /sns/
debe hacer que la barra diagonal final sea opcional e incluir el ancla de final de cadena ( ^
). Por ejemplo:
RewriteCond %{REQUEST_URI} !^/sns/?$
Tenga en cuenta que esto sólo coincide con las dos URL indicadas. No coincidirá con una URL del formulario /sns/<something>
.
Eliminé los paréntesis alrededor del segmento de ruta (también debes eliminar otros paréntesis en tu expresión regular). Esto crea un grupo capturado y es superfluo en las directivas que ha publicado.
ACTUALIZAR:También necesitará una verificación adicional para asegurarse de que la URL reescrita (es decir, /index.php/sns
) no sea redirigida. Puede hacer esto de una manera más general aplicando solo la redirección HTTPS en la solicitud inicial, no en la solicitud reescrita, incluyendo una condición adicional:
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
La REDIRECT_STATUS
variable de entorno se establece en "200" después de la primera reescritura exitosa (es decir, el enrutamiento de CodeIgniter). No está configurado en la solicitud inicial (es decir, ^$
cadena vacía).
Si esto aún resulta en una redirección, entonces es posible que CodeIgniter esté activando la redirección (después de .htaccess
haber sido procesado).
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
Aparte:Y como señalé en mi comentario, debes eliminar el ./
prefijo en elRewriteRule
sustitución. Ver elfin de mi respuestaenesta pregunta de StackOverflowpara una explicación.
Resumen
Options +FollowSymlinks
RewriteEngine On
# Block hidden directories
RewriteRule ^\. - [F]
# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$
# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$
# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$
# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
La redirección de HTTP a HTTPS debería ser en última instancia una redirección 301 (permanente), pero solo una vez que hayas confirmado que funciona correctamente. La R
bandera por sí sola tiene como valor predeterminado una redirección 302 (temporal).
(¿Tampoco necesita el <IfModule>
contenedor, a menos que su sitio esté diseñado para funcionar sin mod_rewrite?)