For HttpClient’s documented environment-proxy policy, example.internal and .example.internal have different matches. The bare name selects the parent host; the leading-dot form selects its subdomains.

If both should be direct, include both in the startup environment:

export no_proxy='example.internal,.example.internal'

Merge these with the intended existing bypass list. On systems with case-sensitive variable names, .NET checks lowercase proxy environment names before uppercase ones, so a stale no_proxy can take precedence over NO_PROXY.

Within the application, the default selector can be inspected without issuing the destination HTTP request:

foreach (var host in new[] {
    "example.internal", "api.example.internal", "other.internal"
})
{
    var uri = new Uri("https://" + host + "/");
    Console.WriteLine($"{host}: bypass={HttpClient.DefaultProxy.IsBypassed(uri)}");
}

The fragment uses System and System.Net.Http. Inspect the actual handler proxy instead if the application explicitly supplied another IWebProxy. Set the intended environment before the default proxy is initialized.

These are .NET’s documented rules. A curl result using the same string does not establish that another client selected the same route, and a bypass decision still requires direct network reachability.

Artihkkalat mat laktásit