У меня есть приложение, работающее на heroku с экспрессом на узле с https. Как мне определить протокол для принудительного перенаправления на https с помощью nodejs на heroku?
Мое приложение - это простой http-сервер, он (пока) не понимает, что heroku отправляет ему https-запросы:
/* Heroku provides the port they want you on in this environment variable (hint: it's not 80) */
app.listen(process.env.PORT || 3000);
app.get('*',function(req,res,next){ if(req.headers['x-forwarded-proto']!='https') res.redirect('https://mypreferreddomain.com'+req.url) else next() })
Ответы:
На сегодняшний день, 10 октября 2014 г. , с использованием стека Heroku Cedar и ExpressJS ~ 3.4.4 , вот рабочий набор кода.
Главное, что нужно помнить, это то, что мы развертываем на Heroku. Прекращение действия SSL происходит на балансировщике нагрузки, прежде чем зашифрованный трафик достигнет вашего приложения узла. Можно проверить, использовался ли https для выполнения запроса с помощью req.headers ['x-forwarded-proto'] === 'https' .
Нам не нужно беспокоиться о наличии локальных SSL-сертификатов внутри приложения и т. Д., Как если бы вы размещали в других средах. Однако вы должны сначала получить надстройку SSL, применяемую через надстройки Heroku, если используете свой собственный сертификат, поддомены и т. Д.
Затем просто добавьте следующее, чтобы выполнить перенаправление с чего-либо, кроме HTTPS, на HTTPS. Это очень близко к принятому выше ответу, но:
Код:
Примечание для пользователей SailsJS (0.10.x). Вы можете просто создать политику (enforceSsl.js) внутри api / policy:
Затем обратитесь к config / policy.js вместе с любыми другими политиками, например:
источник
res.redirect
умолчанию используется перенаправление 302 (по крайней мере, в Express 4.x). Из соображений SEO и кеширования вам, вероятно, потребуется перенаправление 301. Заменить соответствующую строку наreturn res.redirect(301, ['https://', req.get('Host'), req.url].join(''));
Express 4.x
удалитеapp.configure
линию и просто используйте внутреннее зелье.app.configure
является устаревшим кодом и больше не входит в экспресс.Ответ - использовать заголовок «x-forwarded-proto», который Heroku передает вперед, как это делает его прокси-объект. (примечание: они также передают несколько других x-переменных, которые могут быть удобными, проверьте их ).
Мой код:
Спасибо, Брэндон, просто ждал 6-часовой задержки, которая не позволила мне ответить на мой собственный вопрос.
источник
GET
через?&& process.env.NODE_ENV === "production"
в свое условие, если хотите, чтобы он работал только в производственной среде.В принятом ответе есть жестко запрограммированный домен, что не очень хорошо, если у вас есть один и тот же код на нескольких доменах (например, dev-yourapp.com, test-yourapp.com, yourapp.com).
Используйте вместо этого:
https://blog.mako.ai/2016/03/30/redirect-http-to-https-on-heroku-and-node-generally/
источник
req.hostname
с ,req.headers.host
возможно , экспресс - версии я нахожусь в 4,2Я написал небольшой модуль узла, который применяет SSL в экспресс-проектах. Работает как в стандартных ситуациях, так и в случае обратных прокси (Heroku, nodejitsu и др.)
https://github.com/florianheinemann/express-sslify
источник
Если вы хотите протестировать
x-forwarded-proto
заголовок на своем локальном хосте, вы можете использовать nginx для настройки файла vhost, который проксирует все запросы к вашему приложению node. Ваш файл конфигурации nginx vhost может выглядеть такNginX
Важным моментом здесь является то, что вы проксируете все запросы на порт 3000 localhost (именно здесь работает ваше приложение узла) и настраиваете кучу заголовков, включая
X-Forwarded-Proto
Затем в вашем приложении определите этот заголовок как обычно
Экспресс
Коа
Хосты
Наконец, вам нужно добавить эту строку в свой
hosts
файлисточник
Вам следует взглянуть на heroku-ssl-redirect . Работает как часы!
источник
Если вы используете cloudflare.com в качестве CDN в сочетании с heroku, вы можете легко включить автоматическое перенаправление ssl в cloudflare следующим образом:
Войдите и перейдите в личный кабинет
Выберите правила страницы
источник
Пользователи Loopback могут использовать слегка адаптированную версию ответа arcseldon в качестве промежуточного программного обеспечения:
сервер / промежуточное ПО / forcessl.js
сервер / server.js
источник
Это более конкретный способ Express.
источник
источник
С app.use и динамическим URL. Работает как локально, так и на Heroku у меня
источник
Проверка протокола в заголовке X-Forwarded-Proto отлично работает на Heroku, как и указал Дерек. Как бы то ни было, вот суть промежуточного программного обеспечения Express, которое я использую, и его соответствующий тест.
источник