2009-07-10 8 views
19

Abbiamo un sito di acquisti che stiamo ospitando su un host condiviso (Mediatemple Gridserver). Alcune parti del sito devono utilizzare HTTPS (checkout, ecc.), Mentre il resto dovrebbe usare HTTP.Passaggio corretto tra HTTP e HTTPS utilizzando .htaccess

Qualcuno sa come possiamo forzare sempre l'uso corretto di HTTP/HTTPS per determinati URL? Abbiamo funzionato in vari stati ma non possiamo ottenere una richiesta per una pagina che dovrebbe essere su HTTP ma viene richiesto con HTTPS di tornare indietro correttamente.

Ho dato un'occhiata a SO ma non ho trovato una risposta adatta a questo.

+0

ha a stare con .htaccess? Che lingua è il sito utilizzando? – random

+0

Cosa stai cercando di evitare che con l'https? –

risposta

33

io uso qualcosa di simile a questo per la mia cartella admin in WordPress:

#redirect all https traffic to http, unless it is pointed at /checkout 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/checkout/?.*$ 
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

La porzione RewriteCond %{HTTPS} on potrebbe non funzionare per tutti i server web. Il mio webhost richiede RewriteCond %{HTTP:X-Forwarded-SSL} on, per esempio.

Se si vuole forzare il contrario, provare:

#redirect all http traffic to https, if it is pointed at /checkout 
RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/checkout/?.*$ 
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

Se si desidera che alcuni modi alternativi per farlo, controllare askapache.

+0

ho controllato il codice sul mio server, utilizzando entrambi i blocchi sopra elencati e funziona senza loop di reindirizzamento –

+0

+1. La risposta è stata "RewriteCond% {HTTP: X-Forwarded-SSL} on" nel mio caso perché sto usando il cloud di RackSpace siti. –

+2

[@ wilmoore's] (http://stackoverflow.com/questions/1108706/correttamente-switching-between-http-and-https-using-htaccess/#9917579) suggerimento per utilizzare l'aggiunta di '% {SERVER_NAME}' sarà utile – antitoxic

0

penso che dovrebbe essere:

RewriteCond %{HTTPS} =on 
^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

Vedere la documentazione mod_rewrite.

13

Questo dovrebbe funzionare in quasi tutti gli scenari e dovrebbe funzionare nel vostro vhost reale o .htaccess:

RewriteEngine on 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(non dimenticate la barra prima di% {} REQUEST_URI in quanto ciò potrebbe consentire il superamento di un numero porta, che è pericoloso)

+1

La tua risposta, mentre elegante, ha un piccolo errore. L'ultima riga dovrebbe avere una barra (/) dopo SERVER_NAME oppure www.test.com/dir inoltra a http: //www.test.comdir – Juhani

+0

@Juhani Grazie per il tuo commento. In realtà,% 1 si associa alla variabile di ambiente {REQUEST_URI} che è relativa alla radice. In altre parole, se hai richiesto http://example.com/123, quindi REQUEST_URI === '/ 123'; quindi, un altro taglio sarebbe superfluo. Funzionerebbe ancora perché nella maggior parte delle configurazioni moderne, Apache eliminerà la barra in più. A meno che tu non abbia l'apache a fare più lavoro, non hai bisogno della barra. Detto questo, ho aggiornato la mia risposta originale per utilizzare% {REQUEST_URI} invece di% 1 in quanto è più indicativa. –

+0

@wilmoore: corretto quando le opzioni sono inserite nel file di configurazione del server, poiché il motore di riscrittura può [hook] (http://httpd.apache.org/docs/2.4/rewrite/tech.html) URL-to- filename-traduzione. Tuttavia, quando inserito in un file di configurazione [per-directory] (http://httpd.apache.org/docs/2.4/rewrite/intro.html#htaccess), l'URI è già stato mappato su un percorso al momento in cui il riscrivi i passaggi del motore in. Il motore di riscrittura lo gestisce eliminando il prefisso della directory, che finisce per rimuovere il leader '/', e la corrispondenza con il risultato. – outis

1

Come descritto in this answer, correggere l'applicazione per utilizzare i collegamenti https:// quando necessario. Non fare affidamento su reindirizzamenti automatici, questo potrebbe portare a un falso senso di sicurezza se non hai reso i tuoi link/moduli serviti oltre https:// vai a https:// URL. L'utilizzo di mod_rewrite rende automaticamente più difficile rilevare tali errori (che possono anche essere vulnerabilità).

5
RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

Ho avuto qualche problema dietro un loadballancer. Ecco come l'ho risolto.

+0

Funziona davvero? Mi ha buttato in un loop di reindirizzamento. Se si dispone di loadbalancer, HTTPS non verrà impostato e verrà raggiunto il primo RewriteCond. Se non lo fai, il secondo RewriteCond sarà soddisfatto. Così ogni volta verrai reindirizzato di nuovo. Ho funzionato usando (un'altra risposta) [http://stackoverflow.com/a/26623196/2182900] che è fondamentalmente la stessa cosa ma senza il '[OR]' - si reindirizza solo se entrambi HTTPS sono disattivati ​​e l'HTTP : X-Forwarded-Proto non è https. –

+0

Questo funziona perfettamente per me. Grazie! –

1

Per me ha funzionato questo (l'ho usato per il sito wordpress e reindirizzamento a HTTPS). È necessario aggiungere le linee di condizione e di regola solo dietro le linee RewriteEngine e RewriteBase:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 
# (end of custom modifications) 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 

Date un'occhiata a condizionare RewriteCond %{HTTP:X-Forwarded-Proto} !https - solo questo ha funzionato per il mio server di hosting. (Ho provato RewriteCond %{SERVER_PORT} !^443$ o RewriteCond %{HTTPS} off pure, ma senza successo.