我在Heroku上成功运行了一个Node应用程序。我购买了一个Expedited SSL证书,一切都正常工作。我访问https...并获得完整的“绿色栏”,证明该站点正在通过https提供服务
但是,非SSL标准的http仍然可用。如何强制应用程序通过https提供服务? 谢谢
在Heroku上,确定请求是否通过http传入有点棘手。https是由Heroku路由层处理的,并将请求传递给使用http的节点应用程序。
这篇文章帮我解决了困惑:http://jaketrent.com/post/https-redirect-node-heroku/
此外,还有一个NPM模块heroku-ssl-redirect可以帮助您处理它。
next-ssl-redirect-middleware
。 - NSjonassslRedirect不是一个函数
) - Nitsan BenHanoch我只需使用Cloudflare的“始终使用HTTPS”功能即可实现。只需按照以下步骤操作:
1. 如果您还没有注册,请在Cloudflare上注册
2. 添加您的网站example.com
3. 选择一个计划。(免费计划就足够了)
4. 查看您的DNS记录。如果您已经在Namecheap等地方有一些条目,Cloudflare会尝试自动检测这些记录。重要的是,您至少保留Type A记录,其中包括IPv4
地址以及CNAME
类型,在这里,Content
是来自Heroku应用程序设置中域名的DNS Target
。请参阅屏幕截图。
5. 为了成功激活您的网站,您需要指向Cloudflare的名称服务器,否则Cloudflare将无法管理您的DNS并优化您的网站。删除现有名称服务器,然后将它们替换为Cloudflare的名称服务器。他们还会在页面上显示说明(可能需要48小时才能激活您的网站,但根据我的经验只需要15分钟)。请参见Namecheap的截图示例:
6. 进入 SSL/TLS
部分,在 Edge Certificates
部分启用“始终使用 HTTPS”功能。现在,所有使用“http”协议的请求都应该被重定向到“https”
奖励1:为了转发没有方案或www的请求,例如如果用户只输入example.com
或www.example.com
,只需创建一个页面规则将这些请求转发到您的安全URL。为此,请转到“页面规则”部分,点击“创建页面规则”按钮。输入应匹配的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。Cloudflare的页面规则也是一种解决方案。只需按照步骤1-5(但在第4步中,您不需要heroku dns目标)为您的第二个域执行此操作。在您遵循了支持所有转发的步骤之后,为您的第二个域添加这三个页面规则。对于.app
域也完美适用(请记住,您可能需要清除缓存才能看到更改)。请参见屏幕截图
如果有人阅读此帖并遇到同样的问题,我曾经发现我的代码是按照这个顺序编写的,这导致了一些问题:
### old way
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();
}
});
### new way (just swap the order)
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'));
我只需要将express.static('build')放在send app.use方法的下面,一切就正常了!
如果您正在开发一个 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
https://github.com/mars/create-react-app-buildpack#user-content-https-only有三件事情需要注意:
//HTTP to HTTPS automatic redirect
const requireHTTPS = (req, res, next) => {
if (!req.secure && req.get('x-forwarded-proto') !== 'https' && process.env.NODE_ENV !== 'development') {
return res.redirect('https://' + req.get('host') + req.url);
}
next();
}
app.use(requireHTTPS);
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);
}
});
app.use()
之前。 - Holger Ludvigsen