【发布时间】:2016-04-24 01:22:19
【问题描述】:
我有一个节点应用程序在 Heroku 上成功运行。我购买了 Expedited SSL 证书,一切正常。我去 https... 并获得一个完整的“绿色条”,证明该网站是通过 https 提供服务的
但是,非 SSL 标准 http 仍然可用。如何强制应用通过 https 提供服务?谢谢
【问题讨论】:
我有一个节点应用程序在 Heroku 上成功运行。我购买了 Expedited SSL 证书,一切正常。我去 https... 并获得一个完整的“绿色条”,证明该网站是通过 https 提供服务的
但是,非 SSL 标准 http 仍然可用。如何强制应用通过 https 提供服务?谢谢
【问题讨论】:
对于任何来看这篇文章的人,我遇到了这个问题,发现我的代码是这样的,这把事情搞砸了:
### 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 方法下方,一切正常!
【讨论】:
使用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);
}
});
【讨论】:
为此,我只使用 Cloudflare 的 "Always use HTTPS"-Feature。只需按照以下步骤操作:
1. Sign Up 在 Cloudflare 上(如果您还没有的话)
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 的请求,只需创建一个页面规则将这些请求转发到您的安全 URL。为此,请转到“页面规则”部分并点击“创建页面规则”按钮。输入应该匹配的 url 并添加设置Forwarding URL 和状态码301 - Permanent Redirect。在末尾输入$1 的目标网址,以使其正常工作。点击“保存并部署”,您就可以开始了。有关更多详细信息,请查看“高级转发选项”部分here(请记住,您可能需要清除缓存才能看到更改)。看截图:
奖励 2:您购买了另一个域,只是想将其重定向到您的安全主域。例如,您购买了fiveexample.com 和5example.com,并且无论用户输入关于5example.com 的内容,您都希望始终将5example.com 重定向到https://www.fiveexample.com。 www.5example.com、http://5example.com 甚至 https://www.5example.com,即使您的第二个域没有 ssl。 Cloudflares 页面规则在这里也是一种解决方案。只需为您的第二个域执行步骤 1-5(但在步骤 4 中您不需要 heroku dns 目标)。按照步骤支持所有转发后,为您的第二个域添加这三个页面规则。也适用于.app 域(请记住,您可能需要清除缓存才能看到更改)。看截图
【讨论】:
这就是我们在 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 标志。
【讨论】:
如果你正在开发 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
【讨论】:
您也可以在基础设施层将 HTTP 请求重定向到 HTTPS,无需更改您的应用程序。
Edge CDN addon 提供“将 HTTP 重定向到 HTTPS”选项。
它将 AWS CloudFront CDN 放在处理重定向的应用程序前面。
Heroku 路由器没有此功能。
【讨论】:
还有NPM模块heroku-ssl-redirect帮你处理
【讨论】:
next-ssl-redirect-middleware
在 Heroku 上,确定请求是通过 http 传入的事实有点棘手。 https 在 heroku 路由层处理,并将请求传递给 http 上的节点应用程序)。
这篇文章让我不解http://jaketrent.com/post/https-redirect-node-heroku/
【讨论】:
app.use()
如果请求来自 HTTP,您需要将代码添加到 Node.js 应用程序以将请求重定向到 HTTPS 版本。
根据您使用的框架或工具,想法很简单:
【讨论】: