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

Zur*_*iar 27 https heroku

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

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

Boo*_*oon 23

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

这篇文章让我松了一口气http://jaketrent.com/post/https-redirect-node-heroku/

  • 该文章中的最后一个代码块效果非常好!但请记住将其放在所有 Express 的“app.use()”的**第**位 (3认同)

Dmi*_*kov 18

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

  • 2022 - 对我不起作用(`sslRedirect 不是函数`) (2认同)

ron*_*ory 18

为此,我只是使用Cloudflare的“始终使用 HTTPS”功能。只需按照以下步骤操作:

1. 如果您还没有注册Cloudflare

2.添加您的站点example.com

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

4.查看您的 DNS 记录。例如,如果您在 Namecheap 上已经有一些条目,Cloudflare 会尝试自动检测记录。什么重要的是,你离开至少与A型记录IPv4的地址,也是CNAME类型,其中ContentDNS Target你的应用程序的Heroku的设置从域名英寸 另请参阅屏幕截图

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仅创建页面规则以将这些请求转发到您的安全 url,则还转发没有方案或 www 的请求。为此,请转到“页面规则”部分并点击“创建页面规则”按钮。输入应该匹配的 url 并添加Forwarding URL带有状态代码的设置301 - Permanent Redirect。在最后输入目标网址,如下所示,$1以使其正常工作。点击“保存并部署”,您就可以开始了。有关更多详细信息,请查看此处的“高级转发选项”部分(请记住,您可能需要清除缓存才能查看更改)。看截图:

cloudflare_page_rule

奖励 2:您购买了另一个域,只想将其重定向到您的安全主域。比如你买了fiveexample.com,并5example.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


Sim*_*tti 6

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

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

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


ben*_*der 6

对于任何人来到这篇文章,我遇到了这个问题,并发现我按照这个顺序编写代码,这搞砸了事情:

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();
  }
});
Run Code Online (Sandbox Code Playgroud)

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


Rya*_*Chu 6

如果你正在开发creat-react-app并且碰巧用来create-react-app-buildpack部署到Heroku(我很懒...)

您可以在static.json文件中指定以下内容

{
  "https_only": true
}
Run Code Online (Sandbox Code Playgroud)

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