2011-02-08 31 views
5

Cuando intento crear reglas para redirigir desde páginas HTTP a páginas HTTPS (solo para páginas específicas) con .htaccess, he recibido un bucle de redirección. ¿Dónde estoy equivocado?Redirección permanente de http a https página

Options +FollowSymLinks 
RewriteEngine On 

RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^(/doctor) [NC, OR] 
RewriteCond %{REQUEST_URI} ^(/client) 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L] 

RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^(/doctor) [NC, OR] 
RewriteCond %{REQUEST_URI} !^(/client) 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L] 

Respuesta

4

que he encontrado respuesta a mi pregunta: ¿

Options +FollowSymLinks 
RewriteEngine On 

RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^(/(client/|doctor/)) 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^(/(client/|doctor/)) 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} 
15

para forzar https para una carpeta en particular utilizar

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L] 

para todo uso del sitio

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L] 

para páginas específicas que podría utilizar

RewriteEngine on 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteCond %{REQUEST_URI} ^/doctor/?.*$ 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L] 

comprobar si el puerto del servidor es diferente de 443 (estándar para conexiones seguras), para asegurar que vamos a redirigir solo conexiones no seguras

Redirige la página secure.php al dominio seguro, enviando el estado de respuesta 301, agregando todas las cadenas de consulta y marcando como última regla, por lo que cualquier regla por debajo de este no será analizada (ya que esto es redirigir, no queremos tomar cualquier otra acción)

aquí es una solución sin utilizar .htaccess he encontrado here

<?php 

//assuming you site structure like www.domain.com/p=doctor 

    $redirectlist = array('doctor','nurse','anyother'); 

    if (in_array($_GET['p'], $redirectlist) && strtolower($_SERVER['HTTPS']) != 'on') { 
     exit(header("location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}")); 
    } 

?> 
+0

Veo, pero tengo un problema cuando quiero mostrar todas las páginas, que no se encuentran en/doctor y/cliente sin https. – misho

+1

No use la variable SERVER_PORT, use HTTPS, de este modo si el puerto de escucha cambia (o escucha en varios puertos), la redirección aún funciona. – Kazar

+0

@kazar: buen punto. – ayush

2

Prueba esto:

Options +FollowSymLinks 
RewriteEngine On 

RewriteCond %{HTTPS} !on 
RewriteCond %{REQUEST_URI} ^/doctor/?.*$ 
RewriteCond %{REQUEST_URI} ^/client/?.*$ 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Si https no está activado, y está accediendo a/doctor o/client (o cualquier subcarpeta de esos dos), debe reenviar a HTTPS.

+0

Desafortunadamente, no funciona. – misho

+0

¿De qué manera no funciona? ¿Está reemplazando sus dos juegos de reescrituras con este único conjunto? – Kazar

+0

No funciona en absoluto. He copiado este texto en mi .htaccess, pero no he redireccionado a las páginas https. – misho

1

Similar a la respuesta de Kazar, pero más concisa.

Options +FollowSymLinks 
RewriteEngine On 

RewriteCond %{HTTPS} !on 
RewriteRule !/(doctor|client)(/.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
+0

Es más conciso, pero si alguna vez necesita agregar páginas nuevas para forzar a HTTPS, entonces tendrá que modificar esa expresión regular, en lugar de agregar una RewriteCond. Empiezas a tener 20 o más páginas seguras y ese regex va a ser bastante largo. – Kazar

Cuestiones relacionadas