Tampermonkey调用fetch时强制指定HTTP版本及CSP跨域问题咨询
问题解答
1. 能否控制Tampermonkey发起请求的HTTP版本?
不能。HTTP版本是浏览器与目标服务器在TCP握手阶段自动协商的结果,前端JavaScript(包括Tampermonkey运行在页面上下文的脚本)没有权限也没有对应的API可以主动指定请求使用的HTTP版本。你尝试添加的Connection、Upgrade头属于浏览器限制修改的逐跳请求头,手动设置会被浏览器直接忽略,额外新增的非标准头还会触发OPTIONS预检请求,和你观察到的现象一致。
2. Twitter站点的报错是否是CORS导致的?
不是,是*内容安全策略(CSP)*拦截导致的。你提供的报错日志明确说明违反了页面的connect-src指令,httpbin.org不在Twitter设置的允许请求的域名列表中,浏览器会直接拦截该请求,根本不会发送到目标服务器。你之前观察到的返回202但无回显数据的情况,本质也是请求被浏览器安全策略拦截后返回的异常响应。
CORS是跨域资源共享策略,仅限制跨域请求的响应是否能被页面读取,不会直接拦截请求发送,和当前你遇到的现象不符。
3. 有没有规避方法?是否无法发起策略外的外部请求?
有规避方法,你可以使用Tampermonkey提供的GM_xmlhttpRequest/GM_fetchAPI发起请求:
- 这两个API是通过Tampermonkey扩展的后台进程发起请求,完全脱离当前页面的上下文,不受页面CSP、CORS策略的限制
- 只需要在脚本头的
@grant字段中声明对应的权限即可正常使用,示例如下:
// ==UserScript== // @name Test Request // @namespace http://tampermonkey.net/ // @version 0.1 // @match https://twitter.com/* // @grant GM_fetch // ==/UserScript== (function() { 'use strict'; GM_registerMenuCommand("Test", postData); })(); async function postData(){ const resp = await GM_fetch('https://httpbin.org/post', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({test: 'data'}) }); const data = await resp.json(); console.log(data); }
使用该API发起请求时,HTTP版本仍然由浏览器和目标服务器协商决定,但可以正常绕开页面的CSP限制拿到返回数据。
内容的提问来源于stack exchange,提问作者user2739975
相关产品推荐
相关产品推荐

