代理和重定向有什么区别



我想为所有来到/的请求提供服务,就好像它们要来/api/一样。例如

/posts/应被视为/api/posts/

据我所知,这是代理,但我不确定代理和重定向之间的区别。主要的混淆来自这样一个事实,即虽然redirect将响应标头的状态代码设置为302,而代理将其设置为200

代理之间有什么区别,我做我想做的事情的最佳方式是什么?

你可能想要的叫做重写:当一个请求进入一个特定的端点时,它会被重写为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 服务器)。

最新更新