我有一个节点应用程序在Heroku上成功运行。我已经购买了加急SSL证书,一切正常。我转到https ...并获得一个完整的“绿色栏”,证明该网站正在通过https提供
但是,非SSL标准http仍然可用。如何强制应用程序通过https服务?感谢
答案 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
您的应用程序的设置。另请参见屏幕截图
5。。您需要指向Cloudflare的名称服务器以成功激活您的站点,否则Cloudflare无法管理您的DNS和优化您的站点。删除现有的名称服务器,然后将其替换为Cloudflare的名称服务器。他们还将在页面上向您显示说明(最多可能需要48小时,直到您的网站处于活动状态,但以我的经验,这只花了15分钟)。请参阅以Namecheap为例的屏幕截图:
6。。转到SSL/TLS
部分,并在Edge Certificates
部分下启用“始终使用HTTPS”功能。现在,所有使用方案“ http”的请求都应重定向到“ https”
奖励1:例如,如果用户仅输入example.com
或www.example.com
,也可以转发不带方案或www的请求,只需创建一个页面规则即可将这些请求转发至您的安全网址。为此,转到“页面规则”部分,然后单击“创建页面规则”-按钮。输入应该匹配的网址,然后将设置Forwarding URL
与状态代码301 - Permanent Redirect
添加在一起。还要输入目标网址,如下所示,最后加上$1
,以使其正常工作。点击“保存并部署”,就可以开始了。有关更多详细信息,请查看“高级转发选项” here部分(请注意,您可能需要清除缓存以查看更改)。查看屏幕截图:
奖金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
域(请记住,您可能需要清除缓存以查看更改)。查看截图
答案 5 :(得分:3)
如果请求来自HTTP,您需要向Node.js应用添加代码以将请求重定向到HTTPS版本。
根据您使用的框架或工具,这个想法很简单:
答案 6 :(得分:2)
您也可以在基础架构层中将HTTP请求重定向到HTTPS,无需更改应用程序。
Edge CDN addon提供“将HTTP重定向到HTTPS”选项。
它将AWS CloudFront CDN放在您处理重定向的应用程序前面。
Heroku路由器没有此功能。
答案 7 :(得分:1)
答案 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);
}
});