2011-02-08 18 views
5

Quando provo a creare regole per il reindirizzamento da pagine HTTP a pagine HTTPS (solo per pagine specifiche) con .htaccess, ho ricevuto il reindirizzamento in loop. Dove mi sbaglio?Reindirizzamento permanente dalla pagina http a https

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] 

risposta

4

ho trovato risposta alla mia domanda:

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

per forzare HTTPS per una particolare cartella utilizzare

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

per l'intero utilizzo del sito

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

per pagine specifiche si potrebbe usare

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

Verificare se la porta del server è diverso da 443 (standard per connessioni sicure), per garantire che stiamo reindirizzando solo connessioni non protette

Reindirizzare la pagina secure.php per proteggere il dominio, inviare 301 stato di risposta, aggiungere tutte le stringhe di query e il contrassegno è come ultima regola, quindi qualsiasi regola sotto di questo non viene analizzato (dal momento che questo è il reindirizzamento, non vogliamo prendere qualsiasi altra azione)

ecco una soluzione senza utilizzare .htaccess ho trovato 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

Vedo, ma ho problemi quando voglio mostrare tutte le pagine, che non si trovano in/doctor e/client senza https. – misho

+1

Non utilizzare la variabile SERVER_PORT, utilizzare invece HTTPS, in questo modo se la porta di ascolto cambia (o si ascolta su più porte), il reindirizzamento funziona ancora. – Kazar

+0

@kazar: buon punto. – ayush

2

Prova questa:

Options +FollowSymLinks 
RewriteEngine On 

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

Se https non è attivo e si accede/doctor o/client (o qualsiasi sottocartella di questi due), deve inoltrare a HTTPS.

+0

Sfortunatamente, non funziona. – misho

+0

In che modo non funziona? Stai sostituendo i tuoi due set di rewriter con questo singolo set? – Kazar

+0

Non funziona affatto. Ho copiato questo testo nel mio .htaccess, ma non ho reindirizzato alle pagine https. – misho

1

Simile alla risposta di Kazar, ma più conciso.

Options +FollowSymLinks 
RewriteEngine On 

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

È più conciso, ma se hai mai bisogno di aggiungere nuove pagine per forzare su HTTPS, dovrai modificare tale regex piuttosto che aggiungere un RewriteCond. Inizi a ottenere 20 o più pagine sicure e la regex diventerà piuttosto lunga. – Kazar

Problemi correlati