我想要服务所有发送到 /
的请求,就像它们发送到 /api/
一样。例如,
/posts/
应被视为 /api/posts/
据我所知这是代理,但我不确定代理和重定向之间的区别。主要的困惑来自于这样一个事实:redirect
将响应 header 的状态代码设置为 302
,而代理将其设置为 200
。
代理之间有什么区别,对我来说做我想做的事情的最佳方式是什么?
最佳答案
您可能想要的名称是 rewriting :当特定端点收到请求时,它会被重写为 HTTP 服务器可以处理的内容。
借助 Express,您可以使用自定义中间件函数来实现这一点:
app.use(function(req, res, next) {
// If the current request doesn't start with `/api`...
if (req.url.indexOf('/api') !== 0) {
// ...rewrite it by prefixing it with `/api`.
req.url = '/api' + req.url;
}
next();
});
您必须将其包含在路线之前,因此它会在路线之前被调用。
这对客户端来说是完全透明的:他们认为他们正在获取 /posts
的响应,即使在内部,它是由 /api/posts
处理的处理程序。
如果您希望通过重定向使其明确,您可以使用以下内容:
app.use(function(req, res, next) {
if (req.url.indexOf('/api') !== 0) {
return res.redirect('/api' + req.url);
}
next();
});
这根本不透明。它告诉客户端:“嘿,您尝试请求 /posts
,但您需要将请求定向到 /api/posts
” 。这意味着客户必须提出额外的请求。
代理基本上是一种复杂的重写方式,但不是仅仅修改请求以使其最终到达正确的处理程序,而是向 /api/posts
发出实际的内部 HTTP 请求,其结果被发送回客户端。在您的情况下,它太过分了(代理通常用于将请求传递到其他 HTTP 服务器)。
关于node.js - 代理和重定向有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37988883/