Подтвердить что ты не робот

Как перенаправить на 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, когда он завершит восходящий поток?

4b9b3361

Ответ 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).