如何检测Azure网站上的HTTPS重定向?

时间:2013-02-26 08:29:50

标签: node.js azure

根据标题,我有一个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'标头。

3 个答案:

答案 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 复选框。这甚至会在流量到达应用服务之前重定向。