HTTP / Mixed 代理入口与 URLTest
本页说明 HTTP、Mixed、QUIC 出站和 URLTest 的当前运行行为。升级内核后,客户端和控制器应按这些语义处理请求、测速结果和配置切换。
HTTP 与 Mixed 入站
| 入站类型 | 接受的请求 |
|---|---|
http | HTTP CONNECT、标准 HTTP forward-proxy 请求 |
mixed | SOCKS5 TCP、SOCKS5 UDP ASSOCIATE、HTTP CONNECT、标准 HTTP forward-proxy 请求 |
标准 HTTP forward-proxy 请求使用绝对形式的目标地址,例如:
GET http://example.com/status HTTP/1.1
Host: example.comZero 会解析目标地址,按正常路由规则选择出站,再将请求头转换为目标服务器可接受的 origin-form 后转发。请求体和其他头字段会继续沿所选出站传输。
HTTPS 仍通过 CONNECT 建立隧道。Zero 不会在本地代理入口解密 HTTPS 内容。
可用以下命令验证:
curl -x http://127.0.0.1:8080 http://example.com/
curl -x http://127.0.0.1:7890 https://example.com/如果使用 mixed,同一个端口也可以被 SOCKS5 客户端使用。
路由语义
HTTP forward-proxy 请求与 CONNECT、SOCKS5 请求使用同一套路由模型:
- 域名目标可以命中域名规则;
- 已解析或直接提供的 IP 目标可以命中 IP/CIDR 规则;
- 未命中规则时执行
route.final; - 拒绝动作会在建立上游连接前终止请求。
不要为普通 HTTP 请求另建一套旁路转发规则。
QUIC 出站地址与 SNI
Hysteria2 和 VLESS QUIC 出站的 server 可以填写域名。连接时会解析 A/AAAA 记录,去重后依次尝试可用地址,并根据目标地址族创建 IPv4 或 IPv6 UDP endpoint。
对于 VLESS QUIC:
server决定实际连接的网络端点;- QUIC/TLS 的
server_name决定证书校验和 SNI; - 两者可以不同,例如连接一个接入域名,同时使用证书对应的服务名。
当日志出现 quic resolve 时检查 DNS;出现 quic connection 时继续检查 UDP 可达性、端口、SNI、证书和服务端协议配置。域名不应再被当作 SocketAddr 直接解析。
URLTest 探测模型
一个 URLTest 组会并发探测成员,而不是逐个串行等待。当前行为包括:
- 全进程最多同时运行 8 个真实探测;
- 不同 URLTest 组和单节点诊断共享同一个并发上限;
- 同一份活动配置中,相同目标和相同 URL 的并发请求会合并为一次真实探测;
- 一轮探测运行期间再次触发同一组,不会在后面重复排队一整轮;
- 手动探测完成后会重新计算下一次周期时间;
- 结果快照保持配置中的成员顺序,不受实际完成顺序影响。
并发上限用于避免大量节点同时建立真实连接造成资源尖峰;它不代表一个组最多只能包含 8 个成员。
自动策略与单节点诊断
URLTest 与 diagnostics.probe_outbound 共用探测执行器,但不共用结果写入语义:
- URLTest 遵守已有的流量隔离,并更新该组的成员健康、选择和
policy.probe.completed; - 单节点诊断可以绕过已有隔离进行测试,但不清除或延长流量隔离,也不改变 URLTest 的选择;
- 两种探测不会直接把结果写成通用业务连接的成功或失败;
- 本地 DNS、地址/网络不可用、接口设置失败以及客户端取消,不应作为代理节点故障继续累加隔离。
所以手动诊断成功而策略仍显示不可用并不矛盾。排查时同时核对两条路径的 URL、操作类型、策略快照与真实业务连接结果,不能用一次手动成功替代自动健康状态。
URLTest 使用 tolerance_ms 决定切换:当前成员本轮健康时,只有 当前延迟 > 最佳延迟 + 容差 才切换;差值等于容差仍保留当前成员。当前成员不健康时立即选本轮健康候选;全部失败时保留原选择。日志以 operation_kind=policy_urltest 和 diagnostic_outbound 区分两类探测。
控制器与 GUI 接入建议
触发策略组测速时,直接请求该 URLTest 组,不要先展开成员并逐一重复测速。一个 URLTest 组作为另一个 selector 的成员时,也应把它视为一个策略目标。
界面等待结果时建议:
- 记录触发时间和当前配置身份;
- 等待新的
policy.probe.completed事件; - 如果事件丢失,可接受触发时间之后的新鲜策略快照;
- 配置切换后立即结束旧配置的等待状态;
- 不要仅依靠固定短超时判断整组失败。
成员较多时,整组完成时间取决于共享并发上限、单次网络超时和其他同时运行的探测。
常见问题
普通 HTTP 请求仍失败
先确认客户端确实把代理配置为 HTTP 代理,并检查请求是否使用绝对形式。然后查看路由最终动作、目标解析和上游连接错误。
QUIC 域名可解析但连接失败
分别检查解析结果中的 IPv4/IPv6 地址、UDP 防火墙、端口、服务端监听和 TLS server_name。解析成功不代表每个返回地址都可用。
URLTest 重复消耗流量
不要同时对父组、URLTest 组和其全部成员发起独立请求。Zero 会合并同一目标的同时请求,但跨时间或不同探测 URL 仍会产生新的真实连接。

