Как перенаправить на HTTPS с .htaccess на стеке Керока Heroku
Я новичок в облачном хостинге...
Я работаю над веб-приложением PHP, которое размещено на Heroku в качестве приложения "Cedar". Heroku предлагает "копировать обратно" SSL для всех своих поддоменов, поэтому я могу загрузить https://myapp.herokuapp.com
просто отлично. Но я также могу загрузить http://myapp.herokuapp.com
. Я хочу заставить SSL перенаправлять запросы http
на https
.
Обычно это было бы легко. Я бы просто использовал mod_rewrite следующим образом:
RewriteCond %{HTTPS} != on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
НО ЭТО НЕ РАБОТАЕТ НА ГЕРОКУ!
Похоже, что SSL завершает восходящий поток, прежде чем трафик когда-либо попадет в мое приложение. Таким образом, условие %{HTTPS}
никогда не выполняется, и результатом является цикл переадресации. Я также пробовал следующее, что также не сработало:
RewriteCond %{SERVER_PORT} != 443 #<--also redirect loop
RewriteCond %{REQUEST_SCHEME} !https #<--also redirect loop
Итак, мой вопрос в том, как я могу обнаружить/перенаправить на HTTPS, когда он завершит восходящий поток?
Ответы
Ответ 1
Проведя весь день на этом, я понял это!
Проблема красноречиво суммируется здесь.
Итог: Heroku устанавливает свой собственный заголовок, чтобы указать схему ORIGINAL трафика (до того, как SSL завершен на балансировщике нагрузки).
Итак, ЭТО работает в файле .htaccess на 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]
Секретный соус - это линия с HTTP:X-Forwarded-Proto
.
Надеюсь, это поможет кому-то еще иметь те же проблемы! На момент написания этого документа есть документация ZERO.
Ответ 2
Я добавил одну строку к большому ответу, указанному выше, поэтому он не разбивает мою локальную среду разработчиков, которая не настроена на SSL:
# If header is present in the request
RewriteCond %{HTTP:X-Forwarded-Proto} .
(Примечание. RewriteRule применяется только в том случае, если все предшествующие RewriteCond hold).