ExpressJS:获取请求的URL

18

我想从请求中获取客户端请求的URL。

目前我使用:

var requestedUrl = req.protocol + '://' + req.host + ':3000' + req.url;

这真的不太好。它还会忽略我所需要的URL片段(#/something)。

有没有办法可以获取完整的URL?也许可以从头部获取?

谢谢。


你想要实现什么?通常我会使用像backbone或sammy这样的客户端路由框架,它们会透明地根据支持情况使用历史API或片段标识符。然后你可以在服务器上进行内容协商,以确定请求是否是通过ajax发出的(并提供相应的内容)。 - Raoul
我在子域上获取了身份验证路由,并希望将请求的URL存储到会话中,以便我可以从登录域重定向回来。在前端,我也使用backbone。 - bodokaiser
4个回答

25

在服务器端无法获取URL的片段(哈希部分),因为浏览器不会传输它。

片段标识符与URI的其余部分的处理方式不同: 它的处理完全由客户端完成,服务器没有参与 - 当然,服务器通常帮助确定MIME类型,而MIME类型决定片段的处理。当代理程序(如Web浏览器)从Web服务器请求资源时,代理程序发送URI到服务器,但不发送片段。相反,代理程序等待服务器发送资源,然后根据文档类型和片段值处理资源。

摘自维基百科上的片段标识符条目

如果您想获取完整的URL(不包括片段标识符),最好的方法是使用“Host”标头,该标头包括端口,而不是像您当前所做的那样使用req.host:

var requestedUrl = req.protocol + '://' + req.get('Host') + req.url;

1
好的,那么req.protocoll + '://' + req.host + req.url是实现整个URL的最短方式吗? - bodokaiser
是的,那会起作用,你也可以从头部获取主机。 - Raoul
事实上,从文档中可以看出:req.host返回“Host”头字段中的主机名(不包括端口号)。因此,如果您想考虑端口,则最好使用主机头。 - Raoul
那么我应该使用req.get('Host')还是req.host? - bodokaiser
2
如果您在不同环境下运行服务器使用不同的端口,则使用 req.get('Host') 将包含端口号,您就不必编写检查环境并相应调整端口的逻辑。 - Raoul

3

我经常在我的Express应用程序中添加类似以下的内容:

  app.use(function(req, res, next) {
    req.getRoot = function() {
      return req.protocol + "://" + req.get('host');
    }
    return next();
  });

现在你有一个可以根据需要随时调用的函数。

我想知道为什么你需要按需求使用函数,而不是将其存储在变量中并按需使用该变量。 - joedotnot

1

恐怕你能做的就只有这些了。 除非你使用 https,否则可以将协议视为 http。 正如 Raoul 所说,你无法获取 # 后面的任何内容,那是浏览器端的。

   var requestedUrl =  'http://' + req.headers.host + ':3000'  + req.url

使用“Host”头将确保任何端口号都被保留,您不需要在两个地方维护它。此外,他上面提到这是用于登录,所以希望这意味着这是一个https连接。无论哪种方式,req.protocol提供了URL方案。 - Raoul

0

这是您正在寻找的吗?

req._parsedUrl.pathname

如果你还没有使用,你应该使用:

var util = require('util'); // core module
console.log(util.inspect(req));

调试时找出那种数据。


嗯,第一个只给出了URL本身。我使用了您的提示,手动解析“req”。但我没有找到我要找的内容。我想要整个资源(协议+主机名+URL+哈希标记)。 - bodokaiser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接