Node.js http-更改请求url?
是否可以在不重定向的情况下更改HTTP请求的url 例如,而不是: 请求1Node.js http-更改请求url?,node.js,http,Node.js,Http,是否可以在不重定向的情况下更改HTTP请求的url 例如,而不是: 请求1 GET /user/abc123/ HTTP/1.1 HTTP/1.1 301 Moved Permanently Location: /files/abc123 请求2 GET /files/abc123 HTTP/1.1 HTTP/1.1 200 OK . . [filecontent] 我可以直接回复文件,但要让客户知道他被重定向了: 单个请求 GET /user/abc123/ HTTP/1.1 HTT
GET /user/abc123/ HTTP/1.1
HTTP/1.1 301 Moved Permanently
Location: /files/abc123
请求2
GET /files/abc123 HTTP/1.1
HTTP/1.1 200 OK
.
.
[filecontent]
我可以直接回复文件,但要让客户知道他被重定向了:
单个请求
GET /user/abc123/ HTTP/1.1
HTTP/1.1 200 OK
Location: /files/abc123
.
.
[filecontent]
据我所知,使用HTTP是不可能做到这一点的。HTTP中的重定向特别意味着客户端应该发送第二个请求 我认为您想要的更类似于为某些资源指定“规范url”,然后在浏览器位置栏中显示此规范url 指定使用
指定规范URL的方法。但是,它没有指定浏览器应该如何处理它(如果有的话)。谷歌使用它来更好地选择索引哪些URL
除了使用
标记外,还可以通过HTTP链接
头指定资源之间的关系,即链接:;rel=canonical
。看见不过,我不确定谷歌是否会接受这一点。页面上没有提到谷歌支持它。浏览器肯定会忽略它,就像他们对待任何链接标签一样,样式表是一个显著的例外
如果所讨论的内容是HTML文档,则可以使用。具体来说,使用history.replaceState
方法。我认为其他类型的内容不可能实现类似的效果
编辑
内容位置
标题实际上可能非常适合您想要的内容。
来自HTTP 1.1 RFC第14.14节:
当可以从与请求的资源的URI分离的位置访问该实体时,可以使用Content-Location-entity报头字段为消息中包含的实体提供资源位置。服务器应为对应于响应实体的变量提供内容位置;特别是在一个资源有多个与之关联的实体,并且这些实体实际上有单独的位置,可以通过这些位置单独访问它们的情况下,服务器应该为返回的特定变量提供一个内容位置
Content-Location = "Content-Location" ":"
( absoluteURI | relativeURI )
Content Location的值还定义了实体的基本URI
内容位置值不是原始请求URI的替换;它只是请求时对应于该特定实体的资源位置的语句。未来的请求可能会将内容位置URI指定为请求URI,如果希望标识该特定实体的源
另请参见嗯,这是可能的,但感觉有点脏
快速演示:
这是我的简单方法,不仅要更改原始URL,还要更改路径。我的方法建议:
app.use(function(req, res, next) {
console.log("request", req.originalUrl);
const removeOnRoutes = '/not-wanted-route-part';
req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
req.path = req.path.replace(removeOnRoutes,'');
return next();
});
通过这种方式,
/不想要的路由部分/用户
将变成/users
尝试使用URLRewiter@Bytyr Malik,我是在低级别的HTTP上询问的,而不是针对它的软件解决方案。是的,这实现了我上面提到的,但遗憾的是,浏览器在请求后不会在地址栏中显示“/files/abc123”“/user/abc123”。它只会忽略位置标题:(啊,是的,我想我误解了您的确切需求。在这种情况下,您的解决方案至少有一部分必须在客户端实现,正如Meryn所写。位置标题在30x、201、202响应之外没有任何意义。对我来说,仅更改req.url
就足够了。如果我尝试设置req.path
–Typ,我就会出错。)eError:无法设置#的属性路径,它只有一个getter
。内容位置标题似乎正是我要查找的,但遗憾的是,我找不到支持它的浏览器:(
app.use(function(req, res, next) {
console.log("request", req.originalUrl);
const removeOnRoutes = '/not-wanted-route-part';
req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
req.path = req.path.replace(removeOnRoutes,'');
return next();
});