2014-10-21 12 views
15

Sono nuovo di cloud hosting ...Come reindirizzare a HTTPS con .htaccess sulla pila Heroku Cedar

sto lavorando su una web app PHP che è ospitato su Heroku come app "cedro". Heroku offre SSL "piggy back" a tutti i loro sottodomini, quindi posso caricare semplicemente https://myapp.herokuapp.com. Ma posso anche caricare http://myapp.herokuapp.com. Voglio forzare SSL reindirizzando le richieste http a https.

Normalmente, questo sarebbe facile. Vorrei solo usare mod_rewrite come segue:

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

MA QUESTO non lavorare SU Heroku!

Sembra che l'SSL si interrompa a monte, prima che il traffico raggiunga la mia app. Pertanto la condizione %{HTTPS} non viene mai soddisfatta e il risultato è un ciclo di reindirizzamento. Ho anche provato il seguente, che, inoltre, non ha funzionato:

RewriteCond %{SERVER_PORT} != 443 #<--also redirect loop 
RewriteCond %{REQUEST_SCHEME} !https #<--also redirect loop 

Quindi la mia domanda è come posso rilevare/reindirizzamento a HTTPS quando è terminato a monte?

risposta

38

Dopo aver passato tutto il giorno su questo, l'ho capito !!

Il problema viene eloquentemente riepilogato here.

Bottom line: Heroku imposta la propria intestazione personalizzata per indicare lo schema ORIGINALE del traffico (prima che SSL venga terminato con il servizio di bilanciamento del carico).

Quindi, questo funziona in un file .htaccess su Heroku

##Force SSL 

#Normal way (in case you need to deploy to NON-heroku) 
RewriteCond %{HTTPS} !=on 

#Heroku way 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 

#If neither above conditions are met, redirect to https 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

La salsa segreto è la linea con HTTP:X-Forwarded-Proto.

Spero che questo aiuti qualcun altro ad avere gli stessi problemi! Al momento di scrivere questo c'è una documentazione ZERO su questo.

+1

vorrei avrei trovato ieri :( –

+1

Questo solo ci ha aiutato molto. Grazie SDP – Mike

+1

Been sbattere la testa su un muro per le ultime tre ore cercando di capire. Questo risolto. Grazie! Grazie –

0

ho aggiunto una riga alla grande risposta di cui sopra in modo da non rompere il mio ambiente dev locale che non dispone di SSL configurato:

# If header is present in the request 
RewriteCond %{HTTP:X-Forwarded-Proto} . 

(viene applicato nota RewriteRule solo se in possesso di all preceeding RewriteCond) .

Problemi correlati