我希望提供来/
的所有请求,就好像他们来/api/
一样。例如,
/posts/
应视为/api/posts/
据我所知,这是代理,但我不确定代理和重定向之间的区别。主要的混淆来自于redirect
将响应标头的状态代码设置为302
而代理将其设置为200
。
代理之间的区别是什么,以及我做我想做的事情的最佳方式是什么?
答案 0 :(得分:3)
您可能需要的是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服务器)。