7. 重写[rewrite]¶
注意
以下主要讲的是 [rewrite_local]、[rewrite_remote] 或 [mitm] 区块下的内容,所以示例都以 [rewrite_local]、[rewrite_remote] 或 [mitm] 开头表明在其之下,并不是让你每个参数字段前都加上 [rewrite_local]、[rewrite_remote] 或 [mitm]。
以 ; 或 # 或 // 开头的行为注释行。
7.1 添加本地重写¶
警告
所有的HTTPS解密、重写(rewrite)和中间人攻击(MitM),均需安装&信任根证书。
7.1.1 重写类型¶
reject:返回 HTTP 状态代码 404,没有任何内容。该类型对短时间内重复的请求有动态延迟(0~5秒)响应机制:重复越少延迟越小(0),重复越多延迟越大(5)。reject-200:返回 HTTP 状态代码 200,没有内容。reject-img:返回 HTTP 状态代码 200,内容为 1px gif。reject-dict:返回 HTTP 状态代码 200,内容为空 json 对象。reject-array:返回 HTTP 状态代码 200,内容为空 json 数组。request-header:适用于所有 HTTP 标头,而不仅仅是一个标头,因此可以在一个正则表达式中匹配两个或多个标头(包括 CRLF)。response-body:正则替换响应正文内容。request-body:正则替换请求正文内容。jsonjq-response-body/jsonjq-request-body:使用 jsonjq 解析和处理请求正文或响应正文中的 JSON 数据。echo-response:直接返回指定内容类型的正文文件,正文文件应保存在「我的 iPhone - Quantumult X - Data」中。还可自定义响应头,如echo-response text/html\r\nHeader-1: value1\r\nHeader-2: value2 echo-response index.htmlurl-and-header:当 URL 和 请求头两者都匹配时才触发重写。匹配的 headers 字符串包含方法、路径和 key-value 头信息。URL 先被评估,如果 URL 不匹配则不会评估 headers。302/307:HTTP 重定向,将请求重定向至新的 URL。- 如果
rewrite与正文相关,则与长度和编码相关的 HTTP 标头字段将由 Quantumult 自动处理,因此不应自行处理。响应正文和脚本响应正文支持的最大响应大小为 1024kB(解压缩)。 - 如果
body为空,则不会执行 body 相关的重写。 - 在重写中使用 JavaScript 时,可以使用以下对象:
$request、$response、$notify(title, subtitle, message)、console.log(message)和 Quantumult 的内置对象都有前缀$。 $request支持:$request.sessionIndex、$request.scheme、$request.method、$request.url、$request.path、$request.headers$response支持:$response.sessionIndex、$response.statusCode、$response.headers、$response.body、$response.bodyBytes(二进制数据,ArrayBuffer类型,iOS 14.0+ / QX v1.0.19+)$request.sessionIndex等于$response.sessionIndex(当响应与请求关联时)。sessionIndex与橙色「网络活动」面板中的 TCP 记录索引无关。- 如果启用了 Quantumult 通知,
$notify(title, subtitle, message)将发布 iOS 通知。 $prefs用于持久存储:$prefs.valueForKey(key)、$prefs.setValueForKey(value, key)、$prefs.removeValueForKey(key)、$prefs.removeAllValues()。- 如果日志级别为
debug,console.log(message)会将日志输出到 Quantumult 日志文件。 setTimeout(function() { }, interval)将在interval(ms) 后运行函数。script-request-header、script-request-body、script-response-header、script-response-body、script-echo-response和script-analyze-echo-response的脚本应保存在本地「我的 iPhone - Quantumult X - Scripts」或「iCloud Drive - Quantumult X - Scripts」。script-analyze-echo-response与script-echo-response的区别在于前者会等待请求正文。- 各脚本类型的
$done()返回格式: script-request-header:$done({path: modifiedPath, headers: modifiedHeaders})或$done({path: modifiedPath})或$done({})script-response-header:$done({status: modifiedStatus, headers: modifiedHeaders})或$done({headers: modifiedHeaders})或$done({})script-response-body:$done(modifiedBody)或$done({body: modifiedBody, headers: modifiedHeaders, status: modifiedStatus})script-echo-response:$done({status: myStatus, headers: myHeaders, body: myData})script-request-body:$done(modifiedBody)或$done({body: modifiedBody})script-analyze-echo-response:同script-echo-response,但会等待请求正文bodyBytes二进制重写:$done({bodyBytes: buffer})(需 iOS 14.0+ / QX v1.0.19+)- 脚本 URL 支持通过
#附加自定义参数,脚本内使用$environment.sourcePath获取完整路径。 $task.fetch()支持通过opts设置请求选项,如{url: url, opts: {policy: "direct"}}。自 build 934+ 起auto-cookie默认关闭,需开启时可设置opts: {'auto-cookie': true}- 完整示例可在 crossutility/Quantumult-X 找到。
7.1.2 配置文件添加¶
以下为重写在配置文件中的写法
以和风天气去广告为例子:
可以将对应的规则复制粘贴到配置文件对应的部分:

注意主机名hostname的部分不要重复出现:

当然也可以通过UI添加:
注意:URL部分只需要填写以下部分,无需填写url


7.1.3 配置片段添加¶
以和风天气为例,配置片段添加内容无需带有 [rewrite_local] [mitm]等字段
此方法即可将本地内容作为远程资源添加,只不过资源路径是在本地的文件

Tips:本地重写需配置脚本¶
有部分重写资源,需要自行配置重写规则所使用的脚本文件(.js)
以Spotify翻译@app2smile为例(仅做演示,Spotify翻译有跟简单的方法):
注册百度翻译个人开发者: http://api.fanyi.baidu.com/register
注册后如果需要认证可自行选择是否实人认证(高级版需要验证)
开通(通用翻译)API服务: https://fanyi-api.baidu.com/choose
成功后即可看到自己的appid和密钥(不要泄露给任何人): http://api.fanyi.baidu.com/manage/developer
1.Quantumult X其他设置中,打开 iCloud云盘 ;确保已开启 mitm 重写 并 信任安装了证书
2.打开歌词翻译脚本(.js)地址,并一键复制

当然,你也可以将脚本下载到iCloud云盘 ▸ Quantumult X ▸ Scripts文件目录,点击脚本即可在跳转 Quantumult X 编辑
注意:建议打开「文件」的「显示所有拓展名」,防止出现 Spotify-lyric.js.js 这种问题
3.打开 HTTP 请求,点击右下角的脚本编辑器,将复制到的脚本内容「覆盖」

4.配置重写
注意:Spotify-lyric.js的名称要与上面填写的一致
7.2 添加远程重写¶
警告
所有的HTTPS解密、重写(rewrite)和中间人攻击(MitM),均需安装&信任根证书。
7.2.1 配置文件添加¶
远程重写在配置文件 [rewrite_remote] 下添加:
<资源路径>, tag=<资源标签>, update-interval=<更新间隔>, opt-parser=<使用解析器>, inserted-resource=<插入本地规则前>, enabled=<是否启用>
tag资源标签:标识该远程重写规则的名称;update-interval自动更新间隔,单位为秒,设为-1则不更新;opt-parser是否使用资源解析器处理该资源,若关闭则改为false;inserted-resource是否将重写规则插入到本地规则之前;enabled是否启用该资源,若停用则改为false;require-devices(可选)限定该规则仅在指定设备上加载,设备 ID 可在「设置 - 其他设置 - 关于」中查看。示例:require-devices=ID1, ID2
远程重写通常已内置了 hostname,因此多数情况下无需自行填写 [mitm]。
7.2.2 UI添加¶
资源路径需填写引用的远程重写规则地址(需使用 raw 格式地址)。

资源路径需要使用raw地址,点击查看获取方法
以下方的链接举例(这是个网页,不是真正能使用的资源链接):
https://github.com/blackmatrix7/ios_rule_script/blob/master/rule/QuantumultX/12306/12306.list
例如在末尾添加 ?raw=true:
https://github.com/blackmatrix7/ios_rule_script/blob/master/rule/QuantumultX/12306/12306.list?raw=true
或者直接点击 raw 或 view,使用跳转后的链接:
https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/QuantumultX/12306/12306.list

或者将链接里的 blob 修改为 raw:
https://github.com/blackmatrix7/ios_rule_script/raw/master/rule/QuantumultX/12306/12306.list
「资源解析器」:是对引用的资源文件内容(远程or配置片段),进行解析/转换/修改,变成 Quantumult X 支持的内容,可用在Quantumult X 的三个主要模块:①节点 ②分流 ③重写,具体使用说明见解析器下方教程;
如果你的资源解析器是空的,点击查看添加方法
如果你的解析器是空的,「节点页」点击左下角的编辑按钮,需要在 [general] 区块下添加:
当使用非标准 Quantumult X 的重写时,例如一些脚本 .js、其他软件的模块 .sgmodule、插件 .plugin 等,这些里面都包含有重写规则,可开启解析器使其变为 Quantumult X 支持的格式;但这并不意味着上述格式的文件在开启解析器后一定可用。需要自行鉴别。
✅ Surge模块(主要内容为重写规则):https://raw.githubusercontent.com/Keywos/rule/main/module/weibous.sgmodule
✅ 包含重写规则的脚本(.js)
❌ 重写使用的脚本,不包含重写规则:https://raw.githubusercontent.com/RuCu6/QuanX/main/Scripts/12306.js
7.2.3 远程重写资源更新与重写细则查看¶
- 默认自动更新时间为 48 小时,需打开 QX 才可自动更新;
- 可通过配置
update-interval参数自定义更新间隔(单位:秒),设为-1则不更新; - 左滑重写资源可单独更新,并查看其细则;

远程重写片段文件格式参考
远程重写资源文件无需包含 [rewrite_remote] 区块头,只需包含重写规则和可选的 hostname: