Принудите мое приложение heroku использовать SSL (https)

У меня есть приложение node, успешно работающее на Heroku. Я приобрел сертификат ускоренного SSL, и все работает отлично. Я перехожу к https... и получаю полный "зеленый бар", доказывая, что сайт обслуживается через https

Тем не менее, HTTP-протокол, отличный от SSL, по-прежнему доступен. Как заставить приложение обслуживать https? Благодаря

Ответ 1

Вам нужно добавить в приложение Node.js код для перенаправления запроса на версию HTTPS, если запрос поступает из HTTP.

В зависимости от структуры или инструментов, которые вы используете, идея проста:

  • проверить схему запроса
  • если http, перенаправление на https, проходящее по одному и тому же запросу uri и query

Ответ 2

На Heroku это немного сложно определить, что запрос пришел через http. https обрабатывается на уровне маршрутизации heroku и проходит по запросу в приложение node на http).

Это сообщение меня отклеило http://jaketrent.com/post/https-redirect-node-heroku/

Ответ 3

Там также модуль NPM heroku-ssl-redirect помогает вам справиться с ним

Ответ 4

Если вы разрабатываете creat-react-app и случайно используете create-react-app-buildpack для развертывания в Heroku (я ленивый...)

Вы можете указать следующее в вашем файле static.json

{
  "https_only": true
}

https://github.com/mars/create-react-app-buildpack#user-content-https-only

Ответ 5

Для всех, кто приходил на этот пост, у меня возникла эта проблема, и я обнаружил, что у меня есть код в таком порядке, который все испортил:

app.use(express.static('build'));
app.use((req, res, next) => {
  if (req.header('x-forwarded-proto') !== 'https') {
    res.redirect('https://${req.header('host')}${req.url}')
  } else {
    next();
  }
});

Как только я переместил express.static('build') ниже этого метода send.use, все заработало!

Ответ 6

Вы также можете перенаправлять HTTP-запросы к HTTPS на уровне инфраструктуры, не требуя изменений в вашем приложении.

Edge CDN addon предлагает параметр "перенаправить HTTP на HTTPS".

Он помещает AWS CloudFront CDN перед вашим приложением, которое обрабатывает перенаправление.

Маршрутизатор Heroku не имеет этой функции.

Ответ 7

Для этого я просто использую "Всегда использовать HTTPS" -Feature от Cloudflare. Просто выполните следующие действия:

1. Зарегистрируйтесь на Cloudflare, если вы еще этого не сделали

2. Добавьте свой сайт example.com

3. Выберите план. (Для этого достаточно бесплатного плана)

4. Просмотрите свои записи DNS. Cloudflare пытается автоматически обнаружить записи, если у вас уже есть записи в Namecheap, например. Важно, чтобы вы оставили как минимум запись типа A с адресом IPv4, а также типом CNAME, где Content - это DNS Target из доменного имени в настройках Heroku вашего приложения. Смотрите также скриншот

cloudflare_heroku

5. Вам необходимо указать серверы имен Cloudflare для успешной активации вашего сайта, в противном случае Cloudflare не сможет управлять вашим DNS и оптимизировать ваш сайт. Удалите существующие серверы имен, а затем замените их на серверы имен Cloudflare. Они также покажут вам инструкции на странице (может занять до 48 часов, пока ваш сайт активен, но по моему опыту это заняло всего 15 минут). Посмотрите на скриншот с Namecheap в качестве примера:

cloudflare_namecheap

6. Перейдите в раздел SSL/TLS и в разделе Edge Certificates включите "Всегда использовать HTTPS" -Feature. Теперь все запросы со схемой "http" должны быть перенаправлены на "https"

cloudflare_https

Бонус 1: Для пересылки запросов также без схемы или www, например, если пользователь вводит просто example.com или www.example.com, просто создайте правило страницы, чтобы пересылать эти запросы на ваш защищенный URL. Для этого перейдите в раздел "Правила страницы" и нажмите "Создать правило страницы" -Button. Введите URL-адрес, который должен совпадать, и добавьте параметр Forwarding URL с кодом состояния 301 - Permanent Redirect. Введите также целевой URL-адрес, как показано ниже, с $1, чтобы он работал правильно. Нажмите "Сохранить и развернуть", и вы готовы к работе. Подробнее см. в разделе "Дополнительные параметры пересылки" здесь (имейте в виду, что для просмотра изменений может потребоваться очистить кэш). Смотрите на скриншот:

cloudflare_page_rule

Бонус 2: Вы купили другой домен и просто хотите перенаправить его на ваш защищенный основной домен. Например, вы купили fiveexample.com и 5example.com и хотите всегда перенаправлять 5example.com на https://www.fiveexample.com независимо от того, что пользователь вводит в отношении 5example.com, например. www.5example.com, http://5example.com и даже https://www.5example.com, даже если у вашего второго домена нет ssl. Правила страницы Cloudflares также являются здесь решением. Просто выполните шаги 1-5 (но на шаге 4 вам не нужна цель heroku dns) для вашего второго домена. После того, как вы выполнили шаги для поддержки всех переадресаций, добавьте эти три правила страницы для вашего второго домена. Также отлично работает для доменов .app (имейте в виду, что вам может потребоваться очистить кэш, чтобы увидеть изменения). Смотрите скриншот

redirect_second_domain_to_main_domain

Ответ 8

Начиная с июля 2019 года Heroku поддерживает перенаправления HTTPS на ДРУГИЕ ДОМЕНЫ ИЛИ СУБДОМЕНЫ (перенаправление не может указывать на себя). Все, что вам нужно сделать, это настроить запись URL для вашего домена, как описано в этом посте. Полное объявление можно найти здесь.

Ответ 9

Вот как мы перенаправляем http на https в Heroku (у нас более 100 доменов, указывающих на один и тот же сайт, и некоторые не используют SSL, поэтому домены также тестируются в этом случае. Если вам это не нужно, просто не включайте доменные линии):

# Determine if http/https (when behind Heroku proxy it uses X-Forwarded-Proto header to detect)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTP:X-Forwarded-Proto} =https [OR]
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{HTTP_HOST} ^www\.exampledomain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.otherdomain\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^(.*)?.herokuapp.com$ [NC]
RewriteRule ^(.*)$ - [env=proto:https]

Возможно, есть место для улучшения, но он отлично работает для нас.

У нас намного больше строк после этого блока, которые перенаправляются другими способами, поэтому мы не используем флаг L на этом этапе.