Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js http-更改请求url?_Node.js_Http - Fatal编程技术网

Node.js http-更改请求url?

Node.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

是否可以在不重定向的情况下更改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

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();
});