强制我的heroku应用程序使用SSL(https)

时间:2016-01-18 18:57:57

标签: heroku https

我有一个节点应用程序在Heroku上成功运行。我已经购买了加急SSL证书,一切正常。我转到https ...并获得一个完整的“绿色栏”,证明该网站正在通过https提供

但是,非SSL标准http仍然可用。如何强制应用程序通过https服务?感谢

10 个答案:

答案 0 :(得分:21)

在Heroku上,确定请求来自http的事实有点棘手。 https在heroku路由层处理,它将请求传递给http上的节点应用程序。

这篇文章让我脱离了http://jaketrent.com/post/https-redirect-node-heroku/

答案 1 :(得分:14)

还有NPM模块heroku-ssl-redirect帮助您处理它

答案 2 :(得分: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();
  }
});

一旦我移动了app.use方法下面的express.static('build'),一切正常!

答案 3 :(得分:5)

如果您正在开发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

答案 4 :(得分:5)

我只是使用Cloudflare的"Always use HTTPS"-Feature。只需执行以下步骤:

在Cloudflare上

1。 Sign Up

2。。添加您的网站example.com

3。。选择一个计划。 (免费计划就足够了)

4。。查看您的DNS记录。例如,如果您在Namecheap上已经有一些条目,则Cloudflare会尝试自动检测记录。重要的是,您至少要保留类型IPv4地址的类型A记录以及CNAME类型,其中Content是Heroku中域名中的DNS Target您的应用程序的设置。另请参见屏幕截图

cloudflare_heroku

5。。您需要指向Cloudflare的名称服务器以成功激活您的站点,否则Cloudflare无法管理您的DNS和优化您的站点。删除现有的名称服务器,然后将其替换为Cloudflare的名称服务器。他们还将在页面上向您显示说明(最多可能需要48小时,直到您的网站处于活动状态,但以我的经验,这只花了15分钟)。请参阅以Namecheap为例的屏幕截图:

cloudflare_namecheap

6。。转到SSL/TLS部分,并在Edge Certificates部分下启用“始终使用HTTPS”功能。现在,所有使用方案“ http”的请求都应重定向到“ https”

cloudflare_https

奖励1:例如,如果用户仅输入example.comwww.example.com,也可以转发不带方案或www的请求,只需创建一个页面规则即可将这些请求转发至您的安全网址。为此,转到“页面规则”部分,然后单击“创建页面规则”-按钮。输入应该匹配的网址,然后将设置Forwarding URL与状态代码301 - Permanent Redirect添加在一起。还要输入目标网址,如下所示,最后加上$1,以使其正常工作。点击“保存并部署”,就可以开始了。有关更多详细信息,请查看“高级转发选项” here部分(请注意,您可能需要清除缓存以查看更改)。查看屏幕截图:

cloudflare_page_rule

奖金2::您购买了另一个域,只想将其重定向到您的安全主域。例如,您购买了fiveexample.com5example.com,并且无论用户输入的关于5example.com的内容是什么,您都希望始终将https://www.fiveexample.com重定向到5example.comwww.5example.comhttp://5example.com甚至https://www.5example.com,即使您的第二个域没有ssl也是如此。 Cloudflares页面规则也是一种解决方案。只需为第二个域执行步骤1-5(但在步骤4中,您不需要heroku dns目标)。在遵循支持所有转发的步骤之后,为您的第二个域添加这三个页面规则。也适用于.app域(请记住,您可能需要清除缓存以查看更改)。查看截图

redirect_second_domain_to_main_domain

答案 5 :(得分:3)

如果请求来自HTTP,您需要向Node.js应用添加代码以将请求重定向到HTTPS版本。

根据您使用的框架或工具,这个想法很简单:

  • 检查请求方案
  • 如果http,重定向到https传递相同的请求uri和查询

答案 6 :(得分:2)

您也可以在基础架构层中将HTTP请求重定向到HTTPS,无需更改应用程序。

Edge CDN addon提供“将HTTP重定向到HTTPS”选项。

它将AWS CloudFront CDN放在您处理重定向的应用程序前面。

Heroku路由器没有此功能。

答案 7 :(得分:1)

从2019年7月开始,Heroku支持HTTPS重定向到其他域或子域(重定向不能指向自身)。您所要做的就是按照this post中的说明为您的域配置URL记录。完整的公告可以在here中找到。

答案 8 :(得分:0)

这是我们在Heroku上将http重定向到https的方式(我们有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标志。

答案 9 :(得分:0)

使用 nodejs 和 express:

const app = express();

app.enable('trust proxy');
app.use(function (req, res, next) {
  if (req.secure) {
    next();
  } else {
    res.redirect('https://' + req.headers.host + req.url);
  }
});