代理主机名在其显示形式中可能包含国际字符。期望 IDNA ASCII 形式的客户端或解析器需要将该主机名转换,而不是对完整 URL 做随意的百分号转义副本。

在 PowerShell 中,.NET 直接提供该转换:

$mapping = New-Object System.Globalization.IdnMapping
$asciiHost = $mapping.GetAscii($unicodeProxyHost)
$endpoint = New-Object System.UriBuilder
$endpoint.Scheme = 'http'
$endpoint.Host = $asciiHost
$endpoint.Port = 8080

$proxy = New-Object System.Net.WebProxy($endpoint.Uri)

unicodeProxyHost 只是域名。端口和方案保持分开。在发出请求的 HTTP 客户端上使用得到的代理。

对于已经解析的 Uri,IdnHost 会公开其与 IDNA 兼容的主机名表示。请检查原始端点,而不是反复编码已经编码过的标签。

在解析错误中要区分代理的主机名与目标的主机名。转换其中一个并不能修正另一个的拼写错误或缺失的 DNS 记录。也要保留用于证书标识的预期主机名;用任意 IP 地址替换它会改变连接的另一部分。

相关文章