You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Greasemonkey如何获取带重定向页面的HTTP请求URL及响应头Location?

在Greasemonkey中捕获307/308重定向的请求URL与Location响应头

嘿,这个问题我刚好踩过坑!你说的XHR自动跟随重定向拿不到中间信息确实是个麻烦事,但Greasemonkey提供的GM_webRequest API完全能解决这个问题——它可以拦截浏览器发起的所有请求,包括那些307/308的重定向响应,直接拿到你要的请求URL和Location头。

下面是具体的实现步骤和代码示例:

1. 配置脚本权限

首先得在你的Greasemonkey脚本开头的元数据里加上必要的权限声明,不然API用不了:

// ==UserScript==
// @name         Capture 307/308 Redirects
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Capture request URL and Location header for 307/308 redirects
// @author       You
// @match        *://*/*  // 替换成你需要监听的目标域名
// @grant        GM_webRequest
// @connect      *        // 如果重定向到其他域名,需要这里声明允许连接
// ==/UserScript==

2. 编写拦截逻辑

GM_webRequest.onHeadersReceived来监听响应头接收事件,在这里判断状态码是否为307或308,然后提取需要的信息:

GM_webRequest.onHeadersReceived.addListener(
  function(details) {
    // 只处理307临时重定向和308永久重定向
    if (details.statusCode === 307 || details.statusCode === 308) {
      // 获取当前请求的URL(就是调试器里Headers下的Request URL)
      const requestUrl = details.url;
      console.log("请求URL:", requestUrl);

      // 从响应头里找Location字段
      const locationHeader = details.responseHeaders.find(header => header.name.toLowerCase() === 'location');
      if (locationHeader) {
        console.log("重定向目标Location:", locationHeader.value);
        // 这里可以把信息存储起来或者做其他处理
      }
    }
  },
  {
    // 配置要拦截的请求类型,这里选"main_frame"表示页面文档请求,你可以根据需求调整
    urls: ["<all_urls>"],
    types: ["main_frame"]
  },
  // 要获取响应头的话,需要指定"responseHeaders"作为额外信息
  ["responseHeaders"]
);

关键说明

  • details.url就是你在调试器里看到的「Request url」,完全对应;
  • details.responseHeaders是响应头的数组,每个元素包含namevalue,我们通过遍历找到Location头;
  • 如果需要监听其他类型的请求(比如资源、AJAX),可以修改types参数,比如加上"xmlhttprequest""script"等;
  • 注意@match@connect的配置要覆盖你需要监听的域名范围,不然会拦截不到跨域的重定向请求。

我之前做类似需求的时候,用这个方法完美捕获了所有307/308的重定向信息,比XHR靠谱多了——毕竟XHR会自动跳转,根本碰不到中间的重定向响应。

内容的提问来源于stack exchange,提问作者Genjo

火山引擎 最新活动