详解代理自动配置 PAC
转自知乎
最近一直在做跨域中华局域网的工作,了解了很多代理知识和基础概念,很零散,也很细碎。希望通过一段时间的学习,能够自由地穿梭在国际互联网和中华局域网之间。后续会写一系列文章记录我了解到的知识点,本文要说的是我们平时接触比较多的 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 在解析的时候会将结果缓存到系统中
详解代理自动配置 PAC的更多相关文章
- 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 代理自动配置文件PAC的使用方法
我通常上网使用两个浏览器,safari用于一般上网:Chrome安装SwitchyOmega插件,在不同的代理中切换,来保证某些网站的上网速度. 但是这种方式到了手机上就有点懵,几乎所有的iPhone ...
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- mybatis 代码生成器(IDEA, Maven)及配置详解(部分配置你应该不知道)
目录 1 创建代码生成器 1.1 创建Maven项目 1.2 配置 generator.xml 1.3 配置 pom.xml 1.4 使用及测试 2 XML 配置详解 2.1 优先 2.2 官网没有的 ...
- 详解Tomcat核心配置、http协议
Tomcat服务器 Tomcat配置与部署(IDEA) https://www.cnblogs.com/gonghr/p/14731266.html Tomcat手工创建和打包第一个Web工程 在ap ...
- [C#详解] (1) 自动属性、初始化器、扩展方法
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/CSharp-focus-1.html 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...
- spring boot actuator端点高级进阶metris指标详解、git配置详解、自定义扩展详解
https://www.cnblogs.com/duanxz/p/3508267.html 前言 接着上一篇<Springboot Actuator之一:执行器Actuator入门介绍>a ...
- Jenkins进阶系列之——12详解Jenkins节点配置
2014-03-02:修正对于lable标签的理解.(1.532.1版本已经给出了官方解释) 2013-12-22:添加JNLP端口修改,修改了一些错误. Jenkins有个很强大的功能:分布式构建( ...
- 详解webpack-dev-server的配置属性
1.devServer.contentBase 它指定了服务器资源的根目录,如果不写入contentBase的值,那么contentBase默认是项目的目录. 在上面例子中产生错误和后来解决错误的 ...
随机推荐
- 彻底搞定C指针-函数名与函数指针
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int mai ...
- phpstorm中sass编译时目录或内容包含中文字符报错
ruby版本:ruby 2.4.1p111 (2017-03-22 revision 58053) [x64-mingw32] sass版本:Sass 3.4.24 (Selective Steve) ...
- Java学习之Thread方法
一.sleep()方法:在同步中,释放CPU执行权,不释放同步锁,意味着程序停止 二.停止线程方法:原理:run执行完成 1.设置标记 class StopThread implements Runn ...
- 神他么奇怪NoClassDefFoundError
javaweb 项目,部署在Tomcat服务器 十分奇葩的问题 之前一直好好的,今天突然就给报错.代码没动过.真是奇葩.创建User对象报NoClassDefFoundError, User类是一个普 ...
- C语言I博客作业008
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 http://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/9982 我在这个课程的目标是 ...
- 洛谷 P1111 修复公路——并查集
先上一波链接qwq https://www.luogu.org/problem/P1111 这题就是裸的并查集咯qwq 维护一下连通块的数目 数目变为一的时候整个图就连通了 输出此时的答案就okay拉 ...
- Python 学习笔记13 类 - 创建和简单使用
介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...
- python基础--快速排序
1.快速排序 快速排序是一种交换排序. 快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大 ...
- ZOJ 3681E - Cup 2(记忆化dfs)不好读
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/opm777/article/details/25726221 E - Cup 2 Time Limi ...
- ArcGis基础——相接面制造指定距离的分隔带
回家,出发前夜,看完电影吃晚饭回到住处已近十一点,和同事扯了一会儿淡,正准备去睡觉,这哥们儿突然想起一个问题: 如何把相接的面搞出一个20cm的分隔带?因为两区划定项目数据质检要求不同的地块图斑间应有 ...