Skip to content

HTTPS 重写 ​

HTTPS 重写用于按规则重定向、拦截、改写请求或执行脚本。

iOS 上可以做什么 ​

在 iOS 上,HTTPS 重写可以配合可信规则或模块使用,常见用途包括:

  • 拦截广告、追踪和统计请求,减少应用内无关内容。
  • 对指定 URL 做重定向,例如替换接口地址或修正失效链接。
  • 执行请求或响应脚本,用于接口调试、自动化处理和自定义响应。

DANGER

HTTPS 重写会让 Nextin 对指定域名进行 HTTPS 解密。只导入你信任的规则,只对必要的 hostname 开启重写。

HTTPS 重写的本机 CA 证书设置
证书区域,截图局部;安装后还需要在系统设置中打开完整信任。

开启前条件 ​

使用 HTTPS 重写前需要满足:

  1. 已安装并完全信任 Nextin 的本机 CA 证书。
  2. 已添加至少一条重写规则或导入重写模块。
  3. 代理模式为 规则 模式。
  4. 需要重写的域名已填写到 hostname 列表中,或导入模块中包含 hostname。

如果证书未被完全信任,启用 HTTPS 重写 开关无法开启。

如果开关仍然无法开启,可以查看 HTTPS 重写开关打不开。

安装并信任 CA 证书 ​

  1. 打开 Nextin。
  2. 进入 设置。
  3. 打开 HTTPS 重写。
  4. 点击 生成并安装 CA 证书。
  5. Nextin 会打开浏览器下载本机根证书。
  6. 回到 iOS 系统设置,进入 设置 -> 通用 -> VPN 与设备管理。
  7. 在 已下载描述文件 中找到未安装的 Nextin 证书,点进去完成安装。
  8. 再进入 设置 -> 通用 -> 关于本机 -> 证书信任设置。
  9. 找到 Nextin HTTPS Rewrite Root CA。
  10. 打开完整信任。
  11. 回到 Nextin 的 HTTPS 重写 页面,等待状态变为已信任。

证书私钥只保存在本机 Keychain 中,不会同步到 iCloud。

安装后状态没有变为已信任时,可以查看 HTTPS 重写开关打不开。

手动添加重写规则 ​

进入 设置 -> HTTPS 重写 -> 添加重写规则。

一条规则通常包含:

字段说明
名称可选,方便识别
匹配URL 正则表达式,匹配完整请求 URL
动作302、307、REJECT、REJECT-200、REJECT-IMG、REJECT-DICT、REJECT-ARRAY、HEADER、SCRIPT
重写目标或脚本302、307、HEADER、SCRIPT 需要填写
脚本类型Request Header、Request Body、Response Header、Response Body

URL 正则示例:

text
^https://api\.example\.com/v1/ads/.*
^https://www\.example\.com/old-path

动作说明:

动作效果是否需要目标
302临时重定向到目标 URL是
307保持请求方法的临时重定向是
REJECT拒绝请求否
REJECT-200返回空的 200 响应否
REJECT-IMG返回占位图片否
REJECT-DICT返回空字典 JSON否
REJECT-ARRAY返回空数组 JSON否
HEADER内部转发到替换后的 URL,不向客户端返回 302/307是
SCRIPT执行远程脚本是

302、307 和 HEADER 的目标可以使用正则捕获组,例如 $1、$2。

Hostname 格式 ​

HTTPS 重写只会对 hostname 列表中的域名尝试解密。

手动 hostname 支持每行一个或用逗号分隔:

text
api.example.com
*.example.com
buy.itunes.apple.com, *.googlevideo.com

通配符示例:

写法匹配
api.example.com只匹配这个域名
*.example.com匹配 example.com 和它的子域名
.example.com匹配 example.com 和它的子域名

导入重写模块 ​

进入 设置 -> HTTPS 重写 -> 导入重写模块,可以粘贴模块内容或填写模块 URL。

模块格式兼容常见 Shadowrocket 风格:

text
#!name=Example Rewrite

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

[URL Rewrite]
^https://api\.example\.com/v1/ads url reject-200
^https://api\.example\.com/old url 302 https://api.example.com/new

[Script]
Example Script = type=http-response, pattern=^https://api\.example\.com/v1, requires-body=true, script-path=https://example.com/script.js, timeout=10

支持的模块段落:

段落支持内容
[General]force-http-engine-hosts
[MITM]hostname
[URL Rewrite]302、307、reject、reject-200、header
[Map Local]仅支持 data="" status-code=200,会转换为 REJECT-200
[Script]type=http-request、type=http-response
[Rule]仅支持 UDP 的 REJECT 或 REJECT-DROP 路由规则

[Script] 规则必须包含:

text
type=http-request 或 type=http-response
pattern=URL 正则
script-path=https://example.com/script.js

可选参数:

text
requires-body=true
binary-body-mode=true
argument=key=value
max-size=2097152
timeout=10

WARNING

导入模块时,不支持的规则会被跳过。导入完成后建议打开对应分组检查 hostname、Rewrite/Script 和 Rule 数量。