【问题标题】:http.nonProxyHosts ignored on localhost only仅在 localhost 上忽略 http.nonProxyHosts
【发布时间】:2023-03-04 05:58:02
【问题描述】:

出于调试目的,我在 localhost:2080 上运行了一个代理。我可以使用以下任一方式查看通过我的代理的流量:

curl http://localhost:8888/stuff --proxy localhost:2080
curl http://some.server.com:8888/stuff --proxy localhost:2080

使用 Spring 应用程序或简单的 HttpURLConnectionExample Java application,当我调用 some.server.com 时,我看到请求通过代理,但从未在 localhost 上,即使我将 http.nonProxyHosts 设置为随机值(到避免使用默认的localhost)。

我通过添加以下代码确保将我的 JVM 参数考虑在内:

System.out.println("java.version="+props.getProperty("java.version"));
System.out.println("http.proxyHost="+props.getProperty("http.proxyHost"));
System.out.println("http.proxyPort="+props.getProperty("http.proxyPort"));
System.out.println("http.nonProxyHosts="+props.getProperty("http.nonProxyHosts"));

产生以下输出:

java.version=1.8.0_131
http.proxyHost=localhost
http.proxyPort=2080
http.nonProxyHosts=dummy.snafu.com
https.proxyHost=localhost
https.proxyPort=2080
https.nonProxyHost=dummy.snafu.com
Testing 1 - Send Http GET request

Sending 'GET' request to URL : http://localhost:8888/stuff
Response Code : 200
hello

使用以下 JVM 参数运行时,为什么对 localhost 的 HTTP 请求不通过我的代理?

  • -Dhttp.proxyHost=localhost
  • -Dhttp.proxyPort=2080
  • -Dhttp.nonProxyHosts=dummy.snafu.com

【问题讨论】:

  • 您是否从客户端应用程序中检查了nonProxyHosts 的值?
  • 是的,感谢您的提问。为我的问题添加了相关代码和输出。

标签: java http proxy localhost


【解决方案1】:

这是 DefaultProxySelector 的限制,它总是将本地 Uris(localhost, 127.*, etc) 附加到您配置为 nonProxyHosts 的任何内容上,基本上绕过所有本地 Uris(localhost|127.*|[::1] 的代理) |0.0.0.0|[::0])。幸运的是,有一种解决方法是创建您自己的代理选择器并将其注册为默认值。

【讨论】:

  • 我已经通过实现一个简单的代理选择器(几行代码)使其工作,如果您需要示例,请告诉我。这对于 fiddler 等本地流量跟踪很有用。
  • 感谢您的提议,但我最终使用了 Proxy-Vole github.com/MarkusBernhardt/proxy-vole
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
相关资源
最近更新 更多