HTTP_PROXY,HTTPS_PROXY和NO_PROXY环境变量是否标准?


25

似乎有许多程序旨在读取这些环境变量,以决定要通过哪个代理才能连接到Internet上的资源。这些程序可能还具有自己的单独的代理设置,但是如果未设置它们,它们将很乐意使用这些环境变量...

  • HTTP_PROXY
  • HTTPS_PROXY
  • NO_PROXY

我只是想知道:

  • 这些环境变量是否标准?
  • 是否存在书面建议规范(可能由OS制造商提供?),建议使用这些环境变量?

1
我不知道no_proxy,但是http_proxy(小写)是标准的
Uwe Burger

@UweBurger也许您可以声明哪些程序在使用它。我已经看到了它在wget的使用
barlop

Answers:


18

我同意BillThor的说法,即这更是一种约定而非标准。
我不知道这些变量的起源,但是在* nix上使用HTTP的情况下,许多约定似乎源自libcurl HTTP库和curl命令行程序的行为。

https://curl.haxx.se/docs/manual.html上,有libcurl / curl可以理解的与使用HTTP代理相关的环境变量的描述:

环境变量

Curl读取并理解以下环境变量:
http_proxy, HTTPS_PROXY, FTP_PROXY

应该为协议特定的代理设置它们。一般代理应设置为
ALL_PROXY

设置了一个逗号分隔的不应该通过任何代理的主机名列表(仅星号,“ *”匹配所有主机)
NO_PROXY

如果主机名与这些字符串之一匹配,或者主机在这些字符串之一的域内,则不会代理与该节点的事务。

请注意,http_proxy在这些变量中,只有一个拼写为小写。一些库/程序寻找这些变量的小写名称,而另一些则寻找大写字母的名称。为了安全起见,应定义每个变量的小写和大写版本。

另一个问题是引用的主机名匹配描述NO_PROXY不准确,并且无法回答以下问题:

  • 值是否应该是完全限定的域名(FQDN),从而以类似foo.example.com.或否的点结尾?
  • 应该foo.example.com只匹配这一个域还是应该匹配任何子域bar.foo.example.com?如果是后者,那么它也应该匹配任何子域中的任何子域bar.baz.foo.example.com吗?
  • .foo.example.com允许(在开始点),如果这样的话我应该与之相匹配?
  • 是否*允许将星号()作为值(*.example.com*example.com)的一部分,如果是,那么如何处理?

缺乏正式规范会导致混乱和错误。这里必须提到libproxy库,该库旨在为代理配置提供正确和一致的支持。从项目的主页页面

存在libproxy来回答以下问题:给定网络资源,我如何到达它?它处理所有细节,使您可以重新开始编程。

进一步阅读:


libproxy对于您提出的问题有什么要说的?我感兴趣的一个:“。foo.example.com是否匹配foo.example.com?”
罗宾·温斯洛


13

这比标准更像是惯例。实际建立连接的一个或多个协议处理程序库可能支持它。Java在其协议库中使用类似的属性。

了解和使用通用约定使开发变得更加简单。它还有助于实现最少惊喜的原则,并使程序更有可能做到这一点just work

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.