【问题标题】:expressjs: get requested urlexpressjs:获取请求的网址
【发布时间】:2012-08-14 13:41:14
【问题描述】:

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

目前我使用:

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

这根本不是很好。它还遗漏了我需要的 url 片段 (#/something)。

有没有办法获得完整的网址?也许在标题之外?

问候

【问题讨论】:

  • 你想达到什么目的?通常我使用一个客户端路由框架,如骨干网或 sammy,它根据支持透明地使用历史 API 或片段标识符。然后您可以在您的服务器上进行内容协商以确定请求是否由 ajax 发出(并提供适当的内容)。
  • 我在子域上获得了身份验证路由,并希望将请求的 url 存储到会话中,以便我可以从登录域重定向回来。在前端我也使用主干

标签: javascript node.js express


【解决方案1】:

这是你要找的吗?

req._parsedUrl.pathname

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

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

调试找出那种数据。

【讨论】:

  • hmm 第一个只给出了 url 本身。我用你的提示和 util 来手动解析“req”。我没有找到我要找的东西。我想要整个资源(协议 + 主机名 + url + hashbang)
【解决方案2】:

恐怕你能做的就这么多了。 除非您使用 https,否则您可以将协议假定为 http。 正如 Raoul 所说,在 # server-side 之后您将无法获得任何东西,这是针对浏览器的

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

【讨论】:

  • 使用“Host”标头将确保保留任何端口号,您无需在两个地方维护它。他还在上面提到这是用于登录,所以希望这意味着它是一个 https 连接。无论哪种方式,req.protocol 都提供了 URL 方案。
【解决方案3】:

您无法在服务器上获取 url 的片段(哈希部分),它不会被浏览器传输。

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

来自Fragment Identifier on Wikipedia

如果您想获取完整的 URL(没有片段标识符),最好的方法是使用包含端口的“主机”标头而不是 req.host,但其他方面与您当前所做的相同:

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

【讨论】:

  • 好的,那么req.protocoll + '://' + req.host + req.url 是实现整个url的最短途径吗?
  • 是的,可以,您也可以从标头中获取主机。
  • 事实上,从文档中:req.host 从“Host”头字段返回主机名(portno 无效)。所以如果你想考虑端口,最好使用主机头。
  • 那么我应该使用 req.get('Host') 还是 req.host?
  • 如果您在不同环境中的不同端口上运行服务器,则使用 req.get('Host') 将包含端口号,您不必编写逻辑来检查环境和调整端口相应地。
【解决方案4】:

我经常在我的快递应用中添加这样的内容:

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

现在你有了一个可以按需调用的函数。

【讨论】:

  • 我想知道为什么您需要一个按需函数,为什么不将它存储在一个变量中并按需使用该变量。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2017-08-03
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多