2014-10-21 15 views
15

Jestem nowy na Cloud Hosting ...Jak przekierować do HTTPS z .htaccess na Heroku Cedar stosie

Pracuję w aplikacji sieci web PHP, który jest gospodarzem na Heroku jako „Cedar” aplikacji. Heroku oferuje "piggy back" SSL do wszystkich subdomen, więc mogę ładować https://myapp.herokuapp.com dobrze. Ale mogę też załadować http://myapp.herokuapp.com. Chcę wymusić SSL, przekierowując żądania http do https.

Normalnie byłoby to łatwe. Chciałbym po prostu użyć mod_rewrite następująco:

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

ale to robi praca ON Heroku!

Wygląda na to, że protokół SSL kończy działanie, zanim ruch trafi do mojej aplikacji. Tak więc warunek %{HTTPS} nigdy nie jest spełniony, a wynikiem jest pętla przekierowania. Próbowałem zostały również następujące dane, które również nie działa:

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

Więc moje pytanie brzmi: w jaki sposób można wykryć/przekierowanie do HTTPS, kiedy to zakończono przed?

Odpowiedz

38

Po spędzeniu całego dnia na tym, wymyśliłem to !!

Kwestia jest elokwentnie podsumowywana here.

Linia dolna: Heroku ustawia własny niestandardowy nagłówek, aby wskazać ORYGINALNY schemat ruchu (przed zakończeniem działania SSL w systemie równoważenia obciążenia).

więc to działa w pliku .htaccess na 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] 

Sekret sos jest linią z HTTP:X-Forwarded-Proto.

Mam nadzieję, że to pomoże komuś innemu mieć te same problemy! W chwili pisania tego jest dokumentacja ZERO na ten temat.

+1

Chciałbym Znalazłem to wczoraj :( –

+1

To właśnie pomógł nam bardzo. Dzięki SDP – Mike

+1

zostały pokoju moją głowę na ścianie w ciągu ostatnich trzech godzin próbuje dowiedzieć się tego. To rozwiązać go. Dzięki! –

0

I dodaje jedną linię do wielkiego odpowiedzi udzielonej powyżej więc nie złamać moje środowiska lokalnego dev, które nie zostały skonfigurowane SSL:

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

(Uwaga RewriteRule jest stosowana tylko wtedy, gdy hold all preceeding RewriteCond za) .

Powiązane problemy