在本地主机上忽略http.nonProxyHosts

3

我在本地主机上运行一个代理服务器,用于调试目的。我可以使用以下任一方式查看通过我的代理传输的流量:

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

使用Spring应用程序或一个简单的 HttpURLConnectionExample Java应用程序,当我调用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

1
你是否在客户端应用程序中检查了 nonProxyHosts 的值? - Malt
是的,谢谢你问。我已经在我的问题中添加了相关的代码和输出。 - ixe013
1个回答

4

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


我通过实现一个简单的代理选择器(几行代码)使其工作,如果您需要示例,请告诉我。这对于使用Fiddler等进行本地流量跟踪非常有用。 - hmble
1
谢谢你的提议,但我最终使用了Proxy-Vole https://github.com/MarkusBernhardt/proxy-vole。 - ixe013

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接