302/307 重定向,临时重定向的协议演进与实战应用指南

导读:

  1. 基础语法结构
  2. JavaScript 脚本示例
  3. 配置步骤
  4. 常用 Pattern 正则示例
  5. 注意事项
  6. 完整配置模板

Shadowrocket(小火箭)的 Rewrite(重写) 功能主要用于修改 HTTP 请求/响应,包括 URL 重定向、请求头修改、响应体篡改(如去广告、解锁 VIP 等),以下是详细的使用指南和脚本示例:


基础语法结构

简单重写规则(配置文件中直接写)

在 Shadowrocket 配置的 [Rewrite] 段落添加:

[Rewrite]^http://example\.com http://new.com 302
# 拒绝连接(去广告)
^https?://ad\.example\.com reject
# 修改请求头
^https?://api\.example\.com header-add X-Custom-Header Value
# 删除响应头
^https?://api\.example\.com header-del X-Frame-Options

JavaScript 脚本(功能更强大)

[Script] 段落引用外部脚本或内联脚本:

[Script]
# 修改响应体(如解锁 VIP、去广告)
ScriptName = type=http-response,pattern=^https?://api\.example\.com/user,requires-body=1,script-path=local/script.js
# 修改请求体
ScriptName2 = type=http-request,pattern=^https?://api\.example\.com/upload,requires-body=1,script-path=local/upload.js

JavaScript 脚本示例

示例 1:解锁 VIP(修改 JSON 响应)

文件:unlock_vip.js

var body = $response.body;
var obj = JSON.parse(body);
// 修改用户状态为 VIP
obj.data.is_vip = true;
obj.data.vip_expire_time = "2099-12-31";
obj.data.level = 99;
$done({body: JSON.stringify(obj)});

配置引用:

[Script]
UnlockVIP = type=http-response,pattern=^https?://api\.example\.com/v1/user/info,requires-body=1,script-path=unlock_vip.js

示例 2:去广告(清空广告数组)

var body = $response.body;
var obj = JSON.parse(body);
// 清空广告列表
if (obj.data && obj.data.ads) {
    obj.data.ads = [];
}
// 或者删除特定字段
delete obj.data.banner;
$done({body: JSON.stringify(obj)});

示例 3:修改请求参数(URL 或 Body)

// 修改 URL 参数
var url = $request.url;
url = url.replace(/version=\d+/, "version=999");
// 如果是 POST 请求修改 body
var body = $request.body;
body = body.replace(/device_id=[^&]*/, "device_id=fake_id_123");
$done({url: url, body: body});

示例 4:重定向(302 跳转)

$done({
    status: "HTTP/1.1 302 Found",
    headers: {
        "Location": "https://new-url.com"
    }
});

配置步骤

开启 HTTPS 解密(MitM)

必须步骤,否则无法解析 HTTPS 内容:

  • 设置 → 证书 → 生成新的 CA 证书 → 安装描述文件
  • iOS 设置 → 通用 → 关于本机 → 证书信任设置 → 开启 Shadowrocket 证书

开启 MitM 功能

在配置文件中添加:

[MITM]
hostname = api.example.com, *.api.com
enable = true

添加脚本

方式 A:本地文件

  • .js 文件放入 iCloud/Shadowrocket 文件夹(或文件 App 中)
  • script-path 使用相对路径如 local/unlock.js

方式 B:远程链接

[Script]
RemoteScript = type=http-response,pattern=^https?://api\.example\.com,requires-body=1,script-path=https://raw.githubusercontent.com/xxx/script.js

常用 Pattern 正则示例

# 匹配特定 API
^https?://api\.example\.com/v\d+/user
# 匹配多个域名
^https?://(api|app)\.(example|test)\.com
# 匹配特定文件类型
^https?://.*\.example\.com/.*\.(json|js|html)

注意事项

  1. 权限问题:iOS 15+ 对本地文件访问有限制,建议使用远程脚本或 iCloud 路径
  2. 性能影响:复杂的正则和脚本会增加延迟,避免使用 贪婪匹配
  3. 语法差异:Shadowrocket 脚本与 Quantumult X 类似,但不完全兼容(主要区别在 $done() 用法)
  4. 调试方法:使用 $notify("标题", "副标题", "内容") 弹出调试信息,或 console.log() 在日志中查看
  5. 合法性警告:修改响应数据可能违反服务条款,仅供学习交流使用

完整配置模板

[General]
bypass-system = true
skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local, captive.apple.com
dns-server = 223.5.5.5, 8.8.8.8
[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
[Rewrite]
^http://(www\.)?example\.com https://www.example.com 302
[Script]
VIPUnlock = type=http-response,pattern=^https?://api\.example\.com/account,requires-body=1,script-path=local/vip.js
[MITM]
hostname = api.example.com
enable = true

需要特定功能的脚本(如 TikTok 解锁、YouTube 去广告等),可以提供具体 API 地址帮你编写对应的 Rewrite 规则。

您可以还会对下面的文章感兴趣: