HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量是标准的吗?

Nik*_*lic 34 environment-variables http http-proxy

似乎很多程序都被设计为读取这些环境变量来决定通过哪个代理来连接到互联网上的资源。这些程序也可能有自己的、单独的代理设置,但如果没有设置,他们会很乐意使用这些环境变量......

  • HTTP_PROXY
  • HTTPS_PROXY
  • NO_PROXY

我只是想知道:

  • 这些环境变量是标准的吗?
  • 是否有书面规范(可能由操作系统制造商提供?)建议使用这些环境变量?

Pio*_*ost 25

我同意 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 的存在是为了回答这个问题:给定一个网络资源,我如何到达它?它处理所有细节,使您能够重新开始编程。

进一步阅读:


小智 20

没有真正的标准。

\n

不同的工具对这些变量的解释类似,但略有不同。例如,识别的环境变量的大小写和大小写优先级curl在和等工具以及 Ruby、Python 和 Go 等语言之间有所不同wget:(此表摘自优秀文章我们需要谈谈:我们可以标准化 NO_PROXY吗?

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\xc2\xa0curlwget红宝石Python
http_proxy(小写)是的是的是的是的是的
HTTP_PROXY(大写)是(警告)是(如果 REQUEST_METHOD 不在环境中)是的
https_proxy(小写)是的是的是的是的是的
HTTPS_PROXY(大写)是的是的是的是的
no_proxy (小写)是的是的是的是的是的
NO_PROXY (大写)是的是的是的是的
大小写优先小写仅小写小写小写大写
\n
\n

有关更多详细信息(特别是关于 NO_PROXY 变​​量)和一些历史记录,请参阅提到的完整文章

\n


Bil*_*hor 13

这与其说是标准,不如说是一种惯例。它可能由一个或多个实际建立连接的协议处理程序库支持。Java 在其协议库中使用了类似的属性。

理解和使用通用约定使开发变得更加简单。它还有助于实施最小意外原则,并使程序更有可能just work