起因

因为我本地采用 Laravel Valet 搭建的 PHP 开发环境,然后处于偷懒的目的,我吧本地开发环境的项目 TLD(顶级域名)改为 .it

但是该域名又与公网的域名冲突,如果走代理会请求到公网上的服务。

相关的文章可以访问《ClashX 忽略指定域名代理

解决方案

将本地的 TLD 改为 .local

这种方案时最快且有效的,但是完美主义的我,不想这么做。

覆盖托管的配置文件

于是我查询了 Surge 的官方文档,发现可以使用 includes 包含配置文件,但是只能包含如下配置块:

[Proxy]
#!include Forwarding.dconf

[Proxy Group]
#!include Forwarding.dconf

[Rule]
#!include Forwarding.dconf

而我们要覆盖的配置项时在 [General] 块中,显然这种方式并不能解决我们的问题。然后我又翻阅到了 Module 相关的文档。

发现这个功能可以覆盖已有的配置,这不就是我想要的吗。然后我在 Surge 的配置文件夹中创建了 SKIPROXY.sgmodule 的配置文件,并写入了如下配置信息:

#!name=Skip Proxy
#!desc=Custom dns server and skip proxy config
#!system=mac

[General]
dns-server = 127.0.0.1, system, 117.50.10.10, 119.29.29.29, 223.6.6.6
skip-proxy = %APPEND% *.it

模块配置支持覆盖、追加和插入通用配置,在 dns-server 选贤中我采用的是覆盖,而 skip-proxy 选项则采用的是追加。

配置好以后,在 Surge 的更多配置中找到模块(Module)配置,会发现里面会多出来一项你自己命名的配置文件,直接勾选启用然后再点击应用就可以了。

Surge custom module

然后查看一下系统网络的配置,中是否设置上了 Bypass proxy:

macOS Bypass proxy settings

这样就可以使用本地的 dnsmasq 服务解析本地开发环境的域名了,同时忽略 *.it 的 HOST 的代理请求。

I hope this is helpful, Happy hacking…