所以先介绍一点背景知识:在 Azure 网站中运行的 NodeJS 服务器将自动将所有 HTTPS 请求定向到 http 端点。这允许以下代码同时适用于 HTTP 和 HTTPS
var http = require('http');
var express = require('express');
var app = express();
// *snip*
http.createServer(app).listen(process.env.PORT);
// can go to http://*.azurewebsites.net or https://*.azurewebsites.net without issue
从这里我决定创建一个“RequireSSL”中间件
/* snip */
if (req.protocol === 'http') {
var origFullUrl: string = 'http://' + req.get('host') + req.originalUrl;
var u: url.Url = url.parse(origFullUrl, true);
u.host = null; // nead to clear so 'port' is used
u.protocol = 'https';
u.port = '443';
res.redirect(url.format(u));
}
/* snip */
这就是背景发挥作用的地方。因为 Azure 将所有 HTTPS 重定向到 HTTP 协议,所以 req.protocol始终等于“http”,从而创建了一个重定向循环。
任何人都知道如何让它在 Azure 网站上工作?