2010-07-22 16 views
16

Ho un progetto client in cui è necessario forzare HTTPS per una determinata cartella e forzare HTTP per tutti gli altri. Posso forzare con successo HTTPS per la cartella che desidero, ma tutti i link al resto del sito finiscono per essere eseguiti tramite HTTPS. Mi piacerebbe avere una regola che costringa le richieste di qualcosa 'non' nella cartella sicura di essere costretti a tornare su HTTP. Ecco quello che ho finora:Forza HTTPS su determinati URL e forza HTTP per tutti gli altri

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

RewriteCond %{HTTPS} !=on 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 

'mio' è il nome della cartella che ho bisogno di forzare HTTPS per.

Qualche idea?

Aggiornamento: Ho anche provato:

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

# Force HTTPS for /my 
RewriteCond %{HTTPS} !=on 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Force HTTP for anything which isn't /my 
RewriteCond %{HTTPS} =on 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Remove index.php from URLs 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 

Ma invece di richieste di/il mio essere forzato attraverso HTTPS hanno ora solo volontà di http://www.example.com/index.php/my

:?

risposta

16

Ah, naturalmente. Il problema sta nel fatto che il set di regole di riscrittura verrà rielaborato dopo essere stato trasformato in index.php dopo il reindirizzamento iniziale. Utilizzando ciò che si ha attualmente, è necessario condizionare ulteriormente i reindirizzamenti per assicurarsi che non vengano applicati dopo la riscrittura su /index.php/my.

qualcosa come il seguente dovrebbe fare:

RewriteEngine On 
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC] 

# Force HTTPS for /my 
RewriteCond %{HTTPS} !=on 
RewriteCond %{THE_REQUEST} ^[A-Z]+\s/my [NC] 
RewriteRule ^(my) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Force HTTP for anything which isn't /my 
RewriteCond %{HTTPS} =on 
RewriteCond %{THE_REQUEST} !^[A-Z]+\s/my [NC] 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 

# Remove index.php from URLs 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 
+0

Grazie, mi ha risparmiato un sacco di tempo! FWIW, in Wordpress, l'httaccess di base di Wordpress IfModule rimuove già index.php dagli URL. – Jason

0

Basta invertire le condizioni:

RewriteCond %{HTTPS} =on 
RewriteRule !^my http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L] 
+0

Hi ya, grazie per la risposta rapida. Ci ho provato ma non ero sicuro di dove collocarlo nel flusso delle mie regole esistenti, di eventuali indicatori? Se lo metto sopra la regola 'Force HTTPS' esistente impedisce che 'Force HTTPS' funzioni e impedisce anche la regola finale che riscrive index.php dall'esecuzione. :? –

+0

@Nathan Pitman: No, dal momento che hanno diverse condizioni di abbinamento non dovrebbero interagire. – Gumbo

+0

ok, ho provato quello che mi hai suggerito (vedi l'aggiornamento al mio post originale) ma questo non ha funzionato. Posso vedere che dovrebbe "ma", ma forse ho le regole nell'ordine sbagliato o certe regole stanno facendo terminare la riscrittura prima che altre condizioni e regole possano essere valutate ...:/ –

1

Questo è qualcosa che funziona da un vecchio sito web del cliente e potrebbe essere adattabile per i vostri scopi:

#If https off and in the cart dir 
RewriteCond %{HTTPS} =off [NC] 
RewriteCond %{REQUEST_URI} ^/cart/(.*) [NC] 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/cart/%1 [R=301,L] 

#If https on and not in cart dir  
RewriteCond %{HTTPS} =on 
RewriteCond %{REQUEST_URI} !^/cart [NC] 
#Above line actually used to read RewriteCond %{REQUEST_URI} !^/cart|media|images|thumbs|css|js [NC] 
#to allow js/css/images to be served so there were no mixed ssl messages popping up to visitors 
RewriteCond %{REQUEST_FILENAME} !index\.php$ [NC] 
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

Sostituzione della spesa con la mia forse

4

Provate, provate a fare al caso vostro:

RewriteEngine On 

RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/my 
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/my 
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 
Problemi correlati