no_proxy是终端场景下最可靠的代理绕过机制;系统设置中的“忽略主机与域”仅对部分apple框架生效且不支持通配符,而cli工具均遵循no_proxy变量的逗号分隔、点号前缀匹配规则。

macOS 代理设置里,no_proxy 是唯一能明确让特定域名绕过代理的机制;其他方式(如系统网络代理界面、http_proxy 环境变量)都不支持通配或域名白名单逻辑。
为什么直接在「系统设置 > 网络 > 代理」里填“例外”不管用
macOS 图形界面中的「忽略这些主机与域」字段只对系统级 HTTP/HTTPS 代理生效,且仅匹配完整主机名(不支持 *.example.com 或正则),也不影响终端命令、CLI 工具(如 curl、wget、git)或后台服务。常见现象是:浏览器走代理,但 curl https://api.internal 仍被转发,根本没绕过。
- 该字段实际写入的是
/Library/Preferences/SystemConfiguration/preferences.plist中的ExceptionsList键,仅被部分 Apple 框架读取 - 不区分协议(HTTP/HTTPS/SOCKS),也不支持子域名通配
- 修改后需执行
sudo networksetup -setwebproxy "Wi-Fi" "" 0并重新启用代理才可能刷新(不稳定)
no_proxy 环境变量是终端场景下最可靠的方式
所有遵循 RFC 标准的 CLI 工具(curl、wget、git、npm、pip)都会检查 no_proxy 变量,并支持逗号分隔、点号前缀匹配(如 .example.com 匹配 api.example.com 和 www.example.com)。
- 临时生效(当前终端会话):
export no_proxy="localhost,127.0.0.1,.internal,.test" - 持久化(推荐写入
~/.zshrc):echo 'export no_proxy="localhost,127.0.0.1,.docker.internal,.local"' >> ~/.zshrc && source ~/.zshrc - 注意大小写无关,但必须用英文逗号分隔,不能有空格
- 如果同时设置了
http_proxy和no_proxy,工具会优先判断域名是否命中no_proxy规则,命中即直连
绕过代理还失败?检查这三个隐藏冲突点
即使配置了 no_proxy,某些情况仍会强制走代理——不是规则无效,而是被更高优先级策略覆盖。
-
git自带 proxy 设置:运行git config --global --get http.proxy,若返回非空值,它会无视no_proxy;清空用git config --global --unset http.proxy - 某些 CLI 工具(如
aws-cli、gcloud)有独立的代理配置项,优先级高于环境变量;查文档确认是否启用了proxy_url类配置 - 公司 MDM(如 Jamf、Intune)可能通过配置描述文件强制注入代理策略,此时系统偏好设置和环境变量均被绕过;可运行
profiles status -type enrollment检查是否受管
真正起作用的绕过逻辑,永远落在具体进程启动时读取的那几个环境变量上;图形界面的“例外”只是个安慰剂,别依赖它处理开发或自动化场景。










