gpt4 book ai didi

node.js - 在 Express/Node 中通过 https 强制请求

转载 作者:搜寻专家 更新时间:2023-10-31 22:31:54 24 4
gpt4 key购买 nike

我有一个运行在端口 3100 上的 Express.js (v 2.5.8)( Node v0.6.12)服务器。它由 Nginx 前端,它代理对端口 3100 的 http 和 https 请求。

我想通过 https 强制某些 url。这是一个示例(应用程序是我的 Express 服务器):

app.get('/applyNow', ensureSec, secure.showApplication );

ensureSec 是我试图用来检查连接是否通过 ssl 的函数:

function ensureSec(req, res, next) {
if (req.session.ssl == true) {
return next();
} else {
req.session.ssl = true;
res.redirect('https://' + url.parse(req.headers.referer).host +
url.parse(req.url).pathname);
}
}

重定向有效,但 Node (在它超时后)抛出一个错误,说“无法获取/applyNow”

重定向到 ssl 的正确方法是什么?

最佳答案

据我了解,您正在使用 nginx 协商 SSL 并将 http 和 https 请求代理到您的 Express 应用程序。如果可能的话,我会选择在 nginx 中解决这个问题,但是如果 nginx 不知道应该保护哪些路径(即只能通过 https 可用)或者你出于其他原因想在你的 express 应用程序中这样做,这里有一些信息:

您应该从 nginx 获取 X-Forwarded-Proto,仅当原始协议(protocol)为 https 时才设置为 https。以下是您在 nginx 中执行此操作的方法:

proxy_set_header X-Forwarded-Proto https;

我还会转发 Host header :

proxy_set_header Host $http_host;

在您的 express 应用程序中,检查它,或重定向到 header 中的主机和请求的路径(express 将其解析为 req.path,因此您不必这样做):

function ensureSec(req, res, next) {
if (req.headers['x-forwarded-proto'] == 'https') {
return next();
} else {
res.redirect('https://' + req.headers.host + req.path);
}
}

关于node.js - 在 Express/Node 中通过 https 强制请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9719148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com