【问题标题】:Setting custom referer in Express app before redirecting在重定向之前在 Express 应用中设置自定义引用者
【发布时间】:2020-12-20 16:24:55
【问题描述】:

我正在开发这个简单的应用程序,它需要我在重定向之前设置自定义引用值。

假设 A 点击了我在 Facebook 上发布的链接 X。现在,如果我检查服务器中的引用值,它会显示“facebook.com”。现在,单击链接 X 后的 A 被重定向到 B 并且 B 显示引用者“facebook.com”。但我希望它在 B 中显示“mywebsite.com”而不是“facebook.com”。我怎样才能做到这一点?

请注意,我在 MDN 中阅读了有关“禁止的标头名称”的信息,但有一个名为 Hitleap 的网站,它是一个流量交换网站。他们允许用户为他们发送的流量设置自定义引用值。所以我想这是可能的。

这是我的路线:

router.get('/:id', (req, res) => {
      res.set('Referer', 'https://mywebsite.com');
      res.redirect('https://boomboom.com');
});

更新

我发现在设置标题的传统方法中是不可能的。所以,我一直在考虑使用以下两种方法来实现这个结果,但我不知道这是否可行。所以寻求反馈。

方法一: 所以当用户点击我的链接时,他会在重定向到最终目的地之前访问我服务器上的一个页面。我服务器上的页面只会说“重定向”。当发生这种情况时,我还将为用户设置完整的标题,包括“Referer”字段。然后重定向到实际页面。

方法二: 方法与方法 1 相同,但这次我想从客户端复制完整的标头,但在用户位于我的“重定向”页面并重定向到最终目的地时更改引用者值。

这些过程中的任何一个都是可能的吗?如果您有任何其他解决方案,请在此处分享。谢谢

【问题讨论】:

  • 不可能,因为referer是由浏览器设置的,而不是服务器响应
  • 您好,感谢您的回复。你的意思是他们正在产生虚假流量,这就是他们能够操纵“推荐人”的原因吗?
  • 没有办法强制浏览器将Referer 设置为某个值。您可以做的是返回200 而不是302,然后让页面内容自动重定向到目标站点。 <meta http-equiv="refresh" ...> 是一种常见的方法,但根据this 它可能不会在所有浏览器中发送Referer。那里的另一个答案建议使用 Javascript 表单提交。
  • Hitleap 等网站充当代理。他们没有返回 HTTP 重定向,而是在服务器上创建自己的请求(因此他们可以将 Referer 设置为他们想要的任何内容),然后将结果返回到您的浏览器。
  • @KevinChristopherHenry 嘿,谢谢您的回复。如果您不介意,您可以提供详细的解决方案吗?我已经检查了您上面链接的页面,但那里的解决方案尚不清楚。他们只是说要进行元刷新或放置表格。我现在的代码非常简单。我没有呈现 html 页面。而router.get('/:id',...) 只是重定向到不在我的应用程序中的目标页面。

标签: node.js http redirect http-headers


【解决方案1】:

Referer headers in the HTTP protocol 从浏览器转到服务器,而不是另一个方向。如果您的服务器向浏览器发送一个,浏览器会忽略它。

标准的商业浏览器很难弄乱浏览器 Javascript 中 Referer 标头的值。因为网络蠕虫。您的计划可能会被某些网站视为尝试执行cross-site request forgery attack。因此,请仔细考虑您的目标。

您可以从您的网站提供一个页面,使您的用户的浏览器立即重定向到所需的网站。类似这样的页面可能会为您解决问题。这意味着在 0 秒后从 URL https://example.com 刷新当前页面。

在刷新过程中,标题标签将浏览器标签的标题设置为“正在重定向...”。我发现这在单点登录重定向中很有用。它让用户知道即将发生的事情。

<html>
  <head> 
    <meta http-equiv="Refresh" content="0; URL=https://example.com/">
    <title>Redirecting...</title>
  </head>
</html>

如果没有设置正确的Referer,可能不是在所有浏览器中,你可以使用一点Javascript来加载一个不可见的表单,然后立即提交。

这个小页面可能会帮到你:

<html>
   <head>
      <title>Redirecting...</title>
   </head>
   <body>
    <form method="GET" action="https://example.com/">
    </form> 
    <script>
       window.onload = function(){{
          document.forms[0].submit()
       }}
    </script>
  </body>
</html>

如果您的用户禁用浏览器 Javascript,则第二种方法将不起作用。但是,话又说回来,大多数网站在这种情况下都无法运行。

您可以使用浏览器的 devtools 网络选项卡解决所有这些问题。它显示每个请求的标头。

【讨论】:

  • 感谢您的详细回答。正如凯文在上面评论的那样,我尝试了这个解决方案,并且推荐人确实更改了我的网站,而不是用户的来源。我希望我能设置它。我在网上阅读过,Kevin 还说可以在代理服务器中创建新的标头。那么这真的可能吗?
  • 是的,这是可能的。但请记住,代理服务器看起来像是对浏览器到服务器通信完整性的中间人攻击。你是在用这种方式欺骗引用者。
  • 是否可以在单个路由中实现代理服务器?我的意思是,每当用户点击我的链接时,他都会进入代理服务器,然后从代理服务器重定向。代理服务器将仅在该路由中设置。这可能吗?
猜你喜欢
  • 2015-11-21
  • 2013-01-07
  • 2010-11-02
  • 2018-11-26
  • 2016-11-14
  • 1970-01-01
  • 2016-04-12
  • 2014-07-04
  • 1970-01-01
相关资源
最近更新 更多