首页 > 解决方案 > 如果单击超链接,使浏览器提交额外的 HTTP-Header

问题描述

如果用户点击链接,有没有办法让网络浏览器提交额外的 HTTP 标头?

背景:在我们的环境中,每个 http-request 在服务器端都有一个唯一的 ID。请参阅https://serverfault.com/questions/797609/apache-x-request-id-like-in-heroku

如果您的 Web 应用程序收到一个 http 请求,我想知道哪个页面是之前的页面。http referrer 是不够的,因为用户可以在他的浏览器中使用多个选项卡。

我想避免将丑陋的请求 ID 放入从浏览器发送到服务器的每个 GET 请求中。到目前为止,我们的 URL 都很好。

我更喜欢的解决方案是一些 JavaScript 魔术,它将当前页面的请求 ID 添加到下一个 http 请求中。

详细步骤:

  1. 浏览器访问 URL http://example.com/search
  2. Web 服务器接收请求 ID 为 123 的 http 请求
  3. Web 服务器将 URL 的内容发送到浏览器(搜索页面)。该页面在某处包含请求 ID 123
  4. 用户搜索“foobar”。
  5. Web 浏览器向服务器提交一个 http 请求,并以某种方式包含先前的请求 ID。
  6. Web 服务器接收到第二个 http 请求(ID 456)并且可以以某种方式访问​​第一个请求(ID 123)的值。
  7. Web 服务器可以将关系“123 --> 456”存储在数据库中以供以后分析。

我的目标是跟踪关系“123 --> 456”。上述解决方案只是实现目标的策略。欢迎其他策略。

我们使用网络框架 django。但是 AFAIK 这在这种情况下确实很重要。

用户可以在他的浏览器中使用多个标签

我详细说明了这对匹配解决方案意味着什么。来自一个用户的一系列请求并不能解决问题。

与多个选项卡一起使用:

  1. 用户在 tab1 中查看页面 A
  2. 用户在 tab2 中查看页面 B
  3. 用户点击页面 A 上的链接到页面 C
  4. 用户点击页面 C 上的链接到页面 D
  5. 用户通过页面 B (tab2) 上的链接到页面 E。

我想知道看两个序列:

A -> C -> D

B -> E

标签: javascriptdjangohttphttp-referer

解决方案


这里唯一的现代“理智”选项是使用 ServiceWorker。

ServiceWorker 可以拦截您控制的域的 HTTP 请求,并用更多标头装饰它。

ServiceWorker 在浏览器选项卡的“外部”工作,如果在同一个网站上打开多个选项卡,则所有这些选项卡都将使用同一个服务工作者。

关于如何完成的完整教程对于这个答案框来说绝对是太多了,但是拦截和处理 HTTP 请求是一个很大的用例,因此场外来源通常会以此为例。

我会说这是一个坏主意。如果你认为你需要这个,也许你可以用不同的方式来处理它。执行此操作的常用方法可能是使用 cookie。


推荐阅读