在某些特别的情况下,我们需要设置代理服务器实现上网的目的,本文主要介绍代理服务器的设置

系统代理服务器设置

Win10系统提供系统级代理服务器设置,通过在Win10系统中设置代理服务器,系统中所有的软件都会通过我们设置的代理服务器访问网络,这样就不用一个一个软件设置代理服务器了,包括浏览器等应用,都会使用设定的系统代理服务器上网。

Win10系统「网络和Internet」,在网络设置中,点击「代理」选项,即可设置系统级的代理服务器。

系统中代理有两种设置

  1. 手动设置代理是全局代理,所有的流量都会走代理服务器
  2. 自动设置代理是自动代理,根据规则决定是否使用代理。设置自动代理可以实现智能分流,多个代理服务器同时使用。

在这里插入图片描述

浏览器的代理服务器设置

更多时候,我们不会做全局的代理服务器设置,因为这样所有的软件都会用我们设定的代理服务器连接网络,更多时候,我们需要某个软件使用代理服务器上网,比如浏览器使用某个代理服务器上网。IE浏览器的代理服务器设置和系统级的代理服务器设置效果是一样的,设置了IE浏览器代理服务器之后,系统的代理服务器也被设置为一样。

但有时候在浏览器中也不希望所有网站流量都走代理,比如希望国内网站不走代理,国外网站走代理,这时也是需要自动代理的。

实现自动代理的方案:

  1. 在浏览器中可以使用 SwitchyOmega 等插件,安装 Privoxy 实现动态代理。
  2. 在系统配置PAC自动代理脚本,优点是跨平台,无需安装第三方软件或插件,几乎所有的系统都支持。

使用浏览器插件 SwitchyOmega 实现浏览器自动代理

下面两篇文章已非常详细,故不再赘述。

chrome浏览器插件SwitchyOmega的安装(离线安装)
SwitchyOmega插件的使用

使用系统自动代理

1、编写自动代理脚本文件

代理自动配置(PAC)文件是一个 JavaScript 脚本,
其核心是一个 JavaScript 函数,用来决定网页浏览请求(HTTP、HTTPS,和 FTP)应当直连目标地址,还是被转发给一个网页代理服务器并通过代理连接。

PAC 文件中的核心 JavaScript 函数通常是这样定义的:

/**
 * @url  google.comURL中类似https://这样的的路径和查询组件已被去除
 * @host 从URL中提取得到的主机名,端口号不包括在此参数中
*/

function FindProxyForURL(url, host) {
  // 
}

自动配置文件应当被保存为一个以.pac作为文件拓展名的文件,比如:

proxy.pac

2、设置代理自动配置文件(PAC)

把PAC上传到http服务器,或者放本地,在系统设置网络中找到自动代理配置,填上PAC的访问地址即可。

3、示例代码

以下示例都是完整的,使用时不需要增加任何其它代码,直接保存应用即可。

例 1 对除本地主机以外的所有连接使用代理
这是只有一个代理服务器情况下最简单高效的自动配置脚本。

function FindProxyForURL(url, host) {
    // 当主机名中没有域名时或主机名与第二个参数匹配时为真
    if (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) {
        return "DIRECT";
    } else {
        return "PROXY w3proxy.mozilla.org:8080; DIRECT";
    }
}

例 2 对防火墙外的本地服务器使用代理
如果有主机(例如生产环境中的 Web 服务器)属于本地域但在防火墙外,仅可通过代理访问,可以通过 localHostOrDomainIs() 来为上述主机添加例外:

function FindProxyForURL(url, host) {
    if (
        // 当主机名中没有域名时或主机名与第二个参数匹配时为真
        (isPlainHostName(host) || dnsDomainIs(host, ".mozilla.org")) &&
        // 且完整域名匹配或主机名(host)匹配时返回true。
        !localHostOrDomainIs(host, "www.mozilla.org") &&
        // 且完整域名匹配或主机名(host)匹配时返回true。
        !localHostOrDoaminIs(host, "merchant.mozilla.org")
    ) {
        return "DIRECT";
    } else {
        return "PROXY w3proxy.mozilla.org:8080; DIRECT";
    }
}

例 3 如果无法解析域名,则使用代理
这个示例可用于网络中的DNS服务器只解析内部主机名的情况,其功能是只对不能成功解析的域名使用代理。

function FindProxyForURL(url, host) {
    // 尝试解析主机名。如果成功,则返回true。
    if (isResolvable(host)) {
        return "DIRECT";
    } else {
        return "PROXY proxy.mydomain.com:8080";
    }
}

例 4 基于网域(Subnet)的选择方案
在此示例中,所有同一子网内的主机均直接连接,其他主机则通过代理连接:

function FindProxyForURL(url, host) {
    // 一个 DNS 主机名,或者一个 IP 地址。如果传入了主机名,则会被此函数解析为 IP 地址,再进行判断。
    if (isInNet(host, "198.95.0.0", "255.255.0.0")) {
        return "DIRECT";
    } else {
        return "PROXY proxy.mydomain.com:8080";
    }
}

例 5 负载均衡 / 基于 URL 模式(pattern)的路由规划
这个例子更复杂,有四 (4) 个代理服务器,其中第四个是备用代理,如果其余三个中的任何一个出现故障,第四个将接管。

注意主代理与备用代理是通过 + 号连接的。

function FindProxyForURL(url, host) {

    if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
      return "DIRECT";
    // 如果字符串(host)匹配指定表达式(*.com)则返回true。
    else if (shExpMatch(host, "*.com"))
      return "PROXY proxy1.mydomain.com:8080; " +
             "PROXY proxy4.mydomain.com:8080";
  
    else if (shExpMatch(host, "*.edu"))
      return "PROXY proxy2.mydomain.com:8080; " +
             "PROXY proxy4.mydomain.com:8080";
  
    else
      return "PROXY proxy3.mydomain.com:8080; " +
             "PROXY proxy4.mydomain.com:8080";
  }

例 6 为不同协议设置不同代理
大多数 JavaScript 标准功能在 FindProxyForURL() 中可用。
作为例子,我们通过startsWith() 为不同的协议设置不同的代理。

function FindProxyForURL(url, host) {

  if (url.startsWith("http:"))
    return "PROXY http-proxy.mydomain.com:8080";

  else if (url.startsWith("ftp:"))
    return "PROXY ftp-proxy.mydomain.com:8080";

  else if (url.startsWith("gopher:"))
    return "PROXY gopher-proxy.mydomain.com:8080";

  else if (url.startsWith("https:") || url.startsWith("snews:"))
    return "PROXY security-proxy.mydomain.com:8080";

  else
    return "DIRECT";
}

参考资料:
代理自动配置(PAC)文件

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐