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

强制我的heroku应用程序使用SSL(https),heroku,https,Heroku,Https,我有一个节点应用程序在Heroku上成功运行。我购买了一个加急SSL证书,一切正常。我去https。。。并获得一个完整的“绿条”,证明该网站是通过https提供服务的 但是,非SSL标准http仍然可用。如何强制应用程序通过https提供服务?谢谢如果请求来自HTTP,您需要向Node.js应用程序添加代码,将请求重定向到HTTPS版本 根据您使用的框架或工具,想法很简单: 检查请求方案 如果是http,则重定向到https,并传递相同的请求uri和查询 在Heroku上,确定请求是通过htt

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


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

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

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

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

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


这篇文章让我大吃一惊

还有一个NPM模块帮助您处理它

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

提供了“将HTTP重定向到HTTPS”选项

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


Heroku路由器没有这一功能。

对于任何一个来到这篇文章的人来说,我遇到了这个问题,发现我的代码顺序是这样的,这把事情搞砸了:

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 app.use方法下面,一切都正常了

如果您正在开发一个
create-react-app
并且碰巧使用
create-react-app-buildpack
部署到Heroku(我很懒…)

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

{
  "https_only": true
}

自2019年7月起,Heroku支持HTTPS重定向到其他域或子域(重定向不能指向自身)。您所要做的就是为您的域配置URL记录,如中所述。可以找到完整的公告。

这就是我们在Heroku上将http重定向到https的方式(我们有100多个域指向同一个站点,有些域不在SSL上,因此在这种情况下也会对这些域进行测试。如果不需要,请不要包括域行):

在这方面可能有改进的余地,但它对我们来说非常有效

在这个块之后,我们有更多的行以其他方式重定向,因此我们在这一点上不使用L标志。

我只是使用fromCloudFlare。只需遵循以下步骤:

1.在Cloudflare上,如果您还没有

2.添加您的站点
example.com

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

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

5.您需要指向Cloudflare的名称服务器以成功激活您的站点,否则Cloudflare无法管理您的DNS并优化您的站点。删除现有名称服务器,然后用Cloudflare的名称服务器替换它们。他们还会在页面上向您显示说明(可能需要48小时,直到您的站点处于活动状态,但根据我的经验,这只需要15分钟)。请参见带有namescape的屏幕截图作为示例:

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

奖励1:如果用户只输入
example.com
www.example.com
只需创建一个页面规则,将这些请求转发到您的安全url,则也可转发不带方案或www的请求。为此,请转到“页面规则”部分并点击“创建页面规则”按钮。输入应匹配的url,并添加设置
转发url
,状态代码为
301-永久重定向
。在末尾输入目标url,如下所示,
$1
,以使其正常工作。点击“保存并部署”,您就可以开始了。有关更多详细信息,请查看“高级转发选项”部分(请记住,您可能需要清除缓存以查看更改)。请参见屏幕截图:

奖励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
域(请记住,您可能需要清除缓存才能看到更改)。见截图


使用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);
  }
});

2019年,这款手机像一个魔咒一样工作,Heroku上的Create React应用程序和GoDaddy的域名都出现了这个问题。服务于构建的express服务器需要这个。仍然像charm 2021Bro一样工作,您真是太棒了!这是最好的解决方案兄弟,我已经连续四个月想弄明白了,你是上帝,我欠你的
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);
  }
});