根据标题,我有一个Node.js应用程序,我希望能够检测是通过HTTPS还是HTTP发出请求。到目前为止,我的重定向看起来像这样:
// Ensure the page is secure, or that we are running a development build
if (req.headers['x-forwarded-proto'] === 'https' || process.env.NODE_ENV === 'development') {
res.render('index');
} else {
winston.info('Request for login page made over HTTP, redirecting to HTTPS');
res.redirect('https://' + req.host);
}
在Nodejitsu上运行正常,但重定向的HTTPS请求没有在Azure上设置'x-forwarded-proto'标头。
答案 0 :(得分:6)
我认为我的评论是正确的:
X-ARR-SSL
似乎是要检查的标题。
// Ensure the page is secure, or that we are running a development build
if (req.headers['x-forwarded-proto'] === 'https' || req.headers['x-arr-ssl'] || process.env.NODE_ENV === 'development') {
res.render('index');
} else {
winston.info('Request for login page made over HTTP, redirecting to HTTPS');
res.redirect('https://' + req.host);
}
答案 1 :(得分:4)
进入完全相同的问题,但以不同的方式解决了它。如果您正在使用Express并启用信任代理,则req.protocol将获取x-forwarded-proto标头。 Azure不会设置x-forwarded-proto标头,但您可以使用x-arr-ssl标头手动破解它,以便req.protocol在应用程序的其余部分返回正确的值。
这是一个要点:https://gist.github.com/freshlogic/6348417
var express = require('express');
var app = express();
app.enable('trust proxy');
// HACK: Azure doesn't support X-Forwarded-Proto so we add it manually
app.use(function(req, res, next) {
if(req.headers['x-arr-ssl'] && !req.headers['x-forwarded-proto']) {
req.headers['x-forwarded-proto'] = 'https';
}
return next();
});
答案 2 :(得分:0)
UPDATE-2021: 这是一个非常古老的答案。长期以来,所有支持自定义域的应用服务计划都有一个选项。转到应用服务的 azure 门户中的自定义域边栏选项卡,并设置仅 HTTPS 复选框。这甚至会在流量到达应用服务之前重定向。