将 WebProxy 绕过项写成正则表达式
用转义的点和显式的主机名边界来构造有效的 System.Net.WebProxy 绕过表达式,而不是使用 shell 风格的通配符。
System.Net.WebProxy 的 BypassList 参数接受的是正则表达式。像 *.office.example 这样的模式并不合法,因为开头的星号前面没有可重复的表达式。
对于发往 office.example 及其子域的 HTTP 和 HTTPS 请求,PowerShell 配置可以使用:
$bypass = @('^https?://([a-z0-9-]+\.)*office\.example(:[0-9]+)?$')
$proxy = [System.Net.WebProxy]::new(
'http://proxy.example:8080',
$false,
[string[]]$bypass
)
转义的点匹配字面意义上的点。重复的主机名标签分组同时允许基础域名和它下面的名字。锚点让 office.example.other.test 这样的名字留在这条规则之外。单引号的 PowerShell 字符串会保留表达式所用的反斜杠。
当前的 .NET 实现会用这些表达式去匹配目标的主机协议、主机名和非默认端口。它不包含请求路径或查询字符串。因此可选端口分组也允许非默认端口;如果策略要求特定服务,请删除或收窄该分组。
本例中 BypassProxyOnLocal 为 false,这样就可以把正则策略与那一项额外的绕过设置分开检查。把得到的代理对象挂到应当使用它的 HTTP 客户端上。对于绕过域之外被允许的公网 URL 测试,可以从 HTTP proxy list 取一条 HTTP 条目来提供地址,无需配置代理账号。
用有代表性的 Uri 值配合 IsBypassed 来检查路由判断:基础域名、一个子域、一个无关的外部主机,以及一个容易误判的更长的后缀。结果为 true 表示选择了直接访问;它并不能证明该直接目的地可以连通。