转自知乎

最近一直在做跨域中华局域网的工作,了解了很多代理知识和基础概念,很零散,也很细碎。希望通过一段时间的学习,能够自由地穿梭在国际互联网和中华局域网之间。后续会写一系列文章记录我了解到的知识点,本文要说的是我们平时接触比较多的 PAC,全名为 proxy auto-config。

什么是 PAC

PAC,一个自动代理配置脚本,包含了很多使用 JavaScript 编写的规则,它能够决定网络流量走默认通道还是代理服务器通道,控制的流量类型包括:HTTP、HTTPS 和 FTP。

它是一段 JavaScript 脚本:

function FindProxyForURL(url, host) {
return "DIRECT";
}

上面就是一个最简洁的 PAC 文件,意思是所有流量都直接进入互联网,不走代理。

PAC 语法和函数

上面函数中,url 字段就是我们在浏览器地址栏输入的待访问地址,host 为该地址对应的 hostname,return 语句有三种指令:

DIRECT,表示无代理直接连接
PROXY host:port,表示走host:port 的 proxy 服务
SOCKS host:port,表示走host:port 的 socks 服务
而返回的接口可以是多个代理串联:

return “PROXY 222.20.74.89:8800; SOCKS 222.20.74.89:8899; DIRECT”;
上面代理的意思是,默认走222.20.74.89:8800 的 proxy 服务;如果代理挂了或者超时,则走 222.20.74.89:8899的 socks 代理;如果 socks 也挂了,则无代理直接连接。从这里可以看出 PAC 的一大优势:自动容灾。

PAC 提供了几个内置的函数,下面一一介绍下:

dnsDomainIs

类似于 ==,但是对大小写不敏感,

if (dnsDomainIs(host, "google.com") ||
dnsDomainIs(host, "www.google.com")) {
return "DIRECT";
}
shExpMatch

Shell 正则匹配,* 匹配用的比较多,可以是*.http://example.com,也是可以下面这样,

if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*")) {
return "DIRECT";
}
isInNet

判断是否在网段内容,比如 10.1.0.0 这个网段,10.1.1.0 就在网段中,

if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0")) {
return "DIRECT";
}
myIpAddress

返回主机的 IP,

if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0")) {
return "PROXY 10.10.5.1:8080";
}
dnsResolve

通过 DNS 查询主机 ip,

if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")) {
return "DIRECT";
}
isPlainHostName

判断是否为诸如http://barret/,http://server-name/ 这样的主机名,

if (isPlainHostName(host)) {
return "DIRECT";
}
isResolvable

判断主机是否可访问,

if (isResolvable(host)) {
return "PROXY proxy1.example.com:8080";
}
dnsDomainLevels

返回是几级域名,比如dnsDomainLevels(http://barretlee.com) 返回的结果就是 1,

if (dnsDomainLevels(host) > 0) {
return "PROXY proxy1.example.com:8080";
} else {
return "DIRECT";
}
weekdayRange

周一到周五,

if (weekdayRange("MON", "FRI")) {
return "PROXY proxy1.example.com:8080";
} else {
return "DIRECT";
}
dateRange

一月到五月,

if (dateRange("JAN", "MAR")) {
return "PROXY proxy1.example.com:8080";
} else {
return "DIRECT";
}
timeRange

八点到十八点,

if (timeRange(8, 18)) {
return "PROXY proxy1.example.com:8080";
} else {
return "DIRECT";
}
alert

据说这个函数可以用来调试,不过我在 Chrome 上测试并未生效,

resolved_host = dnsResolve(host);
alert(resolved_host);

PAC 文件的安装和注意事项

在 Windows 系统中,通过「Internet选项 -> 连接 -> 局域网设置 -> 使用自动配置脚本」可以找到配置处,下放的地址栏填写 PAC 文件的 URI,这个 URI 可以是本地资源路径(file:///),也可以是网络资源路径(http://)。

Chrome 中可以在「chrome://settings/ -> 显示高级设置 -> 更改代理服务器设置」中找到 PAC 填写地址。

需要注意的几点:

PAC 文件被访问时,返回的文件类型(Content-Type)应该为:application/x-ns-proxy-autoconfig,当然,如果你不写,一般浏览器也能够自动辨别
FindProxyByUrl(url, host) 中的 host 在上述函数对比时无需转换成小写,对大小写不敏感
没必要对 dnsResolve(host) 的结果做缓存,DNS 在解析的时候会将结果缓存到系统中

转载于:https://www.cnblogs.com/linuxde/p/8718437.html

详解代理自动配置 PAC相关推荐

  1. win 10 使用本地代理自动配置pac

    win 10 使用本地代理自动配置pac 1.修改注册表 以下内容保为pac.reg,双击.或手动修改注册表. Windows Registry Editor Version 5.00[HKEY_LO ...

  2. Android 代理自动配置PAC研究

    Android 代理自动配置PAC研究 环境 小米6 MIUI9.2 Android7.1.1 MacOS 10.13.3 Charles 4.0.2 什么是PAC PAC,全称Proxy Auto ...

  3. 代理proxy网络代理自动发现wpad代理自动配置pac三个概念解析

    这里使用代理不是目的,抓包和修改请求和响应数据才是目的,使用代理只是为了实现抓包这个目的. 无代理模式 数据直来直往,浏览还可以通过devtools查看到接口的请求和响应数据,但是客户端无法查看和修改 ...

  4. 代理自动配置PAC学习

    什么是 PAC PAC,一个自动代理配置脚本,包含了很多使用 JavaScript 编写的规则,它能够决定网络流量走默认通道还是代理服务器通道,控制的流量类型包括:HTTP.HTTPS 和 FTP. ...

  5. springboot自动配置的原理_SpringBoot实战:详解SpringBoot自动配置原理

    SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...

  6. ActiveMQ配置详解之如何配置自动重新连接

    2019独角兽企业重金招聘Python工程师标准>>> ActiveMQ配置详解之如何配置自动重新连接 博客分类: MQ 这从这一篇开始,将讲解在activeMQ中的相关配置.由于a ...

  7. vscode自动加前缀_详解VScode自动补全CSS3前缀插件以及配置无效的解决办法

    1.在vscode中搜索Autoprofixer 2.在安装完成之后要配置 在需要添加前缀的css文件上,右键点击命令面板,输入Autoprefixer CSS就好啦 ps: 如果想要兼容性最好的话, ...

  8. 实验详解——Cobbler自动部署最小化安装

    实验详解--Cobbler自动部署最小化安装 一.实验:自动部署 二.Cobbler自动装机服务搭建步骤 1.导入epel源并加载在线安装源 2.安装Cobbler以及其相关服务软件包 3.修改cob ...

  9. K8SPod详解之pod配置

    K8SPod详解之pod配置 Pod定义 Pod配置 pod.spec.containers 基本配置 镜像拉取 启动命令 环境变量 端口设置 资源配额 每个pod中都可以包含一个或者多个容器,这些容 ...

最新文章

  1. 可怕!公司部署了一个东西,悄悄盯着你
  2. 【转】PowerDesigner表结构和字段大小写转换
  3. python课程多少钱一节课-日照少儿python编程一节课多少钱
  4. Java实现Zip文件解压
  5. mysql varchar char text
  6. web服务器压力测试工具
  7. 【Shell教程】四----输入输出,条件判断,循环
  8. purrr 0.2.0
  9. 停止、删除所有的docker容器和镜像
  10. 用python简单处理图片(3):添加水印
  11. 592. 分数加减运算
  12. simotion基本功能手册_深入浅出西门子运动控制器——SIMOTION实用手册(1CD)
  13. CorelDRAWX4的VBA插件开发{一}前言及最简单的小程序写法
  14. 什么分区工具可以调整分区大小无损数据?
  15. 微信公众号H5 - 使用vue开发微信公众号网页
  16. 耳机降噪技术-ANC、ENC、DSP、CVC
  17. MCU学习笔记_ARM Cortex M0_简介
  18. 画出Android的大体架构图
  19. Linux查看文件内容的方法
  20. Word文档中实现:点击图片双击放大

热门文章

  1. 对一致性Hash算法,Java代码实现的深入研究
  2. Java - 正则表达式的运用(Pattern模式和Matcher匹配)
  3. 用python写一个简单的推荐系统 1
  4. STL 的string类怎么啦?
  5. 关于浮点数计算时的精度问题
  6. Machine Learning week 4 quiz: Neural Networks: Representation
  7. 大话设计模式(三 复制VS复用)
  8. 【python图像处理】图像的读取、显示与保存
  9. mac mysql启动问题
  10. awk应用小结(所有命令行均经调试)