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是响应头的数组,每个元素包含name和value,我们通过遍历找到Location头;- 如果需要监听其他类型的请求(比如资源、AJAX),可以修改
types参数,比如加上"xmlhttprequest"、"script"等; - 注意
@match和@connect的配置要覆盖你需要监听的域名范围,不然会拦截不到跨域的重定向请求。
我之前做类似需求的时候,用这个方法完美捕获了所有307/308的重定向信息,比XHR靠谱多了——毕竟XHR会自动跳转,根本碰不到中间的重定向响应。
内容的提问来源于stack exchange,提问作者Genjo




