URL 重写
Chute 可以使用不同的方法重写请求的 URL,或者根据 URL 拒绝某些请求。
对于单个请求,只有一条规则会被应用。
注意:明文 HTTP 请求只有经由 Chute 的 HTTP 代理到达时才会被处理;经 TUN 接口到达的明文 HTTP 会被原样转发。Chute Android 让所有流量都经过 TUN,除非在设置中打开了系统 HTTP 代理,它会把 Chute 的 HTTP 代理交给应用使用(Android 10 及以上;默认关闭)。HTTPS 请求只有在其主机经 MitM 解密时才会被处理。
示例:
[URL Rewrite]
^http://www\.google\.cn http://www.google.com header
^http://amazon\.cn https://z.cn 302
^http://ad\.com/ad\.png _ reject
^http://tracker\.com/event _ reject-200
^http://ad\.com/pixel _ reject-img
^http://api\.example\.com/block _ reject-dict
^http://api\.example\.com/list _ reject-array
^http://ad\.com/beacon _ reject-tinygif
重写规则由 3 个部分组成:正则表达式、替换内容和类型。各部分以空白分隔,第一个以 #、; 或 // 开头的词会开启一段注释,一直到行尾;这个段不认引号。见注释。
对于拒绝类型(
reject、reject-200、reject-img、reject-dict、reject-array、reject-tinygif),也接受省略_占位符的两段式简写<模式> reject。简写还接受 Shadowrocket 的reject-drop和reject-no-drop(二者都按reject应答)以及reject-video(按reject-200应答);这三个只能用在简写中,不能作为三段式写法的类型。第二段不是拒绝关键字的两段式写法会被读作改写到该 URL 的 header 模式:^http://a\.com http://b.com等同于^http://a\.com http://b.com header。注意拒绝关键字的拼写——reject200不是关键字,所以^http://ad\.com reject200会被读作改写到reject200的 header 模式。这个替换内容既不是绝对 URL 也不是绝对路径,于是在请求时这次重写会被拒绝并在日志里给出警告,请求原样转发:既没被拒绝,也没被重写。Chute 自己生成的应答——模拟响应(Map Local)、脚本的
response,以及 URL 重写和 REJECT 类策略的应答与错误页——遵守 HTTP:对 HEAD 请求的应答只有头部,其中的 Content-Length 与 GET 得到的相同;状态码为 204、205 或 304 的应答既不带正文,也不带 Content-Length。
Header 模式
Chute 将修改请求头部,并在必要时将请求重定向到另一台主机。客户端不会察觉到这个重写操作。(该模式对应 Surge 的「Map Remote」。)
请求头部中的 Host 字段将被修改以匹配新的 URL。
[URL Rewrite]
^http://www\.google\.cn http://www.google.com header
替换内容也可以是仅包含路径的形式,如 /new/path。在这种情况下,只有请求行会被重写为新路径,请求仍会发送到同一台主机。只有以 scheme 加 :// 开头的替换内容才会被当作 URL,所以查询字符串里带着 URL 的路径(如 /go?to=http://example.com/)仍是仅包含路径的替换。
当目标无法原地重写时——例如将明文 HTTP 请求重写为
https://URL,将(已启用 MitM 的)HTTPS 请求重写到不同源,或者在一条已经建立的明文 HTTP keep-alive 连接上,后续请求命中了一条指向另一台主机的规则——Chute 会自动改为向客户端返回指向新 URL 的 307 重定向,而不是透明地重写头部。
302 模式
Chute 将直接返回一个 302 重定向响应。如果已为该主机名启用了 MitM,则 HTTPS 请求也可以被重定向。
[URL Rewrite]
^http://amazon\.cn https://z.cn 302
307 模式
Chute 将直接返回一个 307 临时重定向响应。如果已为该主机名启用了 MitM,则 HTTPS 请求也可以被重定向。
[URL Rewrite]
^http://amazon\.cn https://z.cn 307
拒绝模式
如果模式匹配,则拒绝该请求。替换参数将被忽略。返回 HTTP 503 响应。如果已为该主机名启用了 MitM,则 HTTPS 请求也会被拒绝。
[URL Rewrite]
^http://ad\.com/ad\.png _ reject
Reject-200 模式
以 HTTP 200 OK 状态码和零长度正文拒绝该请求。适用于静默阻止追踪请求而不触发错误处理。
[URL Rewrite]
^http://tracker\.com/event _ reject-200
Reject-Img 模式
通过返回 1x1 白色 GIF 图片(HTTP 200 OK)来拒绝该请求。适用于阻止广告图片而不出现破损图片占位符。
[URL Rewrite]
^http://ad\.com/pixel _ reject-img
Reject-Dict 模式
通过返回空 JSON 对象 {}(HTTP 200 OK)来拒绝该请求。适用于阻止期望 JSON 响应的 API 调用。
[URL Rewrite]
^http://api\.example\.com/block _ reject-dict
Reject-Array 模式
通过返回空 JSON 数组 [](HTTP 200 OK)来拒绝该请求。适用于阻止期望列表的 API 调用。
[URL Rewrite]
^http://api\.example\.com/list _ reject-array
Reject-TinyGIF 模式
通过返回 1×1 GIF 图像(HTTP 200 OK)来拒绝该请求——这是 Surge 对与 reject-img 相同应答的写法。
[URL Rewrite]
^http://ad\.com/beacon _ reject-tinygif
本页为英文版的翻译。如内容有出入,以英文版为准。