【问题标题】:Node - Tell origin of request节点 - 告诉请求的来源
【发布时间】:2012-08-09 01:24:33
【问题描述】:

是否可以区分直接来自浏览器中 URL 的请求与从远程网页调用的资源之间的区别?

例如,当有人在网络浏览器中直接访问我的 URL(键入 http://mywebsite.com)时,我想提供一个网页,但是当用户通过来自单独域的 URL 调用我的应用程序上的资源时(比如<img src='http://mywebsite.com' />) 那么我想提供不同的内容。

我查看了请求和标头,但无论

【问题讨论】:

标签: node.js request


【解决方案1】:

我认为你正在寻找request.header 中的referer 字符串。

所以简单的版本应该是这样的:

http.createServer(function (req, res) {
  var ref = req.headers.referer;

  if(ref) {
    // serve special content
  }
  else {
    // serve regular homepage
  }
}).listen(1337, '127.0.0.1');

编辑了答案以反映下面来自 anu 的输入 - 它应该是 referer

【讨论】:

  • 这似乎是正确的解决方案,但无论我如何调用 URL,看起来引用者都是未定义的。这是用例 - facehold.it 试图让它响应,所以 <img src='http://facehold.it' /> 将调用不同的路由。
  • 所以referrer字段不能保证被设置。一些浏览器和安全套件将其清除。您可能想做一些更传统的事情,例如在图像 URL 中添加查询字符串以跟踪源用户。
  • 啊,我希望我可以使用相同的路线,但这似乎是不可能的。感谢您的帮助。
  • @JoeLongstreet 是 req.headers.referer 而不是 req.headers.referrer(虽然,referrer 是正确的拼写;请参阅 en.wikipedia.org/wiki/HTTP_referer#Origin_of_the_term_referer 了解混淆的历史)。这就是它未定义的原因。大多数浏览器在发送之前将其设置在请求标头中。有趣的是,document.referrerreferrer 的正确拼写为您提供客户端的推荐人信息。
【解决方案2】:

在中间件中你必须使用这种方式“req.headers.origin”

app.use(function(req, res, next) {
    //var origin=req.headers.origin
    next();
});

【讨论】: