pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)
PAC文件格式
PAC文件是纯文本格式的,实际上就是JavaScript文件。Chrome/Chromium的扩展Switchy!的"Auto Switch Mode"功能实际上也是创建和维护一个简单的PAC文件,但功能比较弱。
对于一般的应用,即使你几乎不懂JavaScript和编程,也可以通过本文的介绍实现基本的功能。
PAC文件FindProxyForURL函数
PAC文件中必须包含一个函数:FindProxyForURL(url, host)。
参数url是用户输入的url,参数host是url中的主机名。
比如url为http://www.truevue.org/javascript/pac-proxy-setting,那么host就是www.truevue.org
一个最简单的PAC文件内容如下:
function FindProxyForURL(url, host) {
return "DIRECT";
}
这个PAC文件实际上什么也没做,对任何URL,都将"DIRECT"(直接连网)。
PAC文件返回值类型
除了可以return "DIRECT"以外,还有两种常用方式:
PROXY proxysample.com:8080
http代理的主机和端口,主机也可以用IP表示
SOCKS5 socks5sample.com:1080
socks5代理的主机和端口,主机也可以用IP表示
那么,我们可以猜测到,用pac指定一个http代理应该这样写
function FindProxyForURL(url, host) {
return "PROXY 192.168.1.1:3128";
}
甚至可以指定多个代理
function FindProxyForURL(url, host) {
return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080";
}
这句语句的意思是:
- 对所有URL,都直接连接;
- 如果不能直接连接,那么就使用192.168.1.1:3128这个http代理连接;
- 如果还是不能连接,则使用lilinux.net:1080这个socks5代理连接。
使用不同连接的顺序和语句中的顺序一致,你可以根据自己的实际情况更改。
也许你明确知道哪些网站不能直连,必须用PROXY或者SOCKS5连接,那么可以对站点分别指定代理配置
function FindProxyForURL(url, host) {
if (shExpMatch(url,"*.google.com/*")) {
return "PROXY 192.168.1.1:3128";
}
if (shExpMatch(url, "*.wikipedia.com:*/*")) {
return "SOCKS5 lilinux.net:1080";
}
if (isInNet(host, "10.0.0.0", "255.0.0.0")){
return "DIRECT";
}
return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080";
}
这个PAC文件中引入了两个新的函数,但从字面意思上,我们也可以猜出代码的大概意思:
- 当url是*.google.com/* 时,自动使用PROXY代理;
- 当url是*.wikipedia.cm/*时,自动使用SOCKS5代理;
- 当host是10.0.0.0 /255.0.0.0的子网内时,自动直连;
- 如果都不匹配,则依次按DIRECT、PROXY、SOCKS5的次序尝试。
shExpMatch函数用来匹配url或者host,匹配的方式和DOS的通配符相似。例如前面用到的"*.google.com/*"可以匹配任意包含".google.com/"的字符串。
Chrome/Chromium 的扩展Switchy!创建的pac文件还自定义了一个函数,可以用来匹配正则表达式,不过个人认为在url匹配上通常不需要使用强大的正则表达式。
isInNet函数用来返回请求的host是否在指定的域内。值得注意的是,isInNet的第二个参数必须是 IP,不能是主机名。因此需要把主机名转换成IP。比如"isInNet(host, dnsResolve(www.google.com), "255.255.255.0")"讲到这里,应该可以解决你的问题了吧。
PAC文件可以使用的JavaScript函数
当然PAC也不止这么简单,它还提供了不少其它函数,在本文就不详细讲述了。http://www.truevue.org/javascript/pac-functions 中列出了PAC代理文件中可以使用的JavaScript函数。
你也许想把pac文件发布到Internet上,这样其它用户就只需要在浏览器中指定pac文件的url即可。你得配置你的服务器映射 .pac 文件后缀到MIME类型: application/x-ns-proxy-autoconfig 如果使用的是Netscape服务器,编辑 config 目录下的 mime.types 文 件。如果是Apache, CERN or NCSA服务器,使用 AddType 指令。
pac (PAC(Proxy Auto Config) 是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。)的更多相关文章
- PAC(Proxy Auto Config)代理自动配置文件的编写
Proxy Auto Config文件格式说明 PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处: 分散Proxy的流量,避 ...
- item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 5解释了比起显式指定类型,使用auto来 ...
- 利用ES6中的Proxy和Reflect 实现简单的双向数据绑定
利用ES6中的Proxy (代理) 和 Reflect 实现一个简单的双向数据绑定demo. 好像vue3也把 obj.defineProperty() 换成了Proxy+Reflect. 话不多说 ...
- unity can't add the script behaviour CallbackExecutor. The script needs ...
记一次Unity3D小问题 当我打开VS2017编辑完C#脚本,要将脚本拖到一个3D组件上时,发生了以下错误 unity can't add the script behaviour Callback ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- 墨菲定律:当你觉得一个地方可能有bug,那么这个地方就会有bug----顺带了解下Tomcat那少有人注意的localhost.log
一.问题概述 题目有点长,但应该值得后端java们了解下有点小坑的localhost.log,让我长话短说. 博主是搞java后端的.后台是很简单的spring mvc + spring框架. 今天测 ...
- 一个 "开箱即用" 个人博客全栈系统项目!vue+node+express+mysql+sequlize+uniapp
" MG'Blog " 一个 "开箱即用" 个人博客全栈系统项目! 探索本项目的源码 » 前台预览 · 管理端预览 v1.0.2 小程序预览 v1.0.2 介绍 ...
- echo '<script>alert("插入成功")</script>';
echo '<script>alert("插入成功")</script>'; <?php if ( ! defined('BASEPATH')) ex ...
- 【转】发布一个基于NGUI编写的UI框架
发布一个基于NGUI编写的UI框架 1.加载,显示,隐藏,关闭页面,根据标示获得相应界面实例 2.提供界面显示隐藏动画接口 3.单独界面层级,Collider,背景管理 4.根据存储的导航信息完成界面 ...
随机推荐
- 牛客网——C列一列
链接:https://www.nowcoder.net/acm/contest/71/C来源:牛客网 题目描述 小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An.尽管他计算 ...
- IOS-static cell 与 dynamic cell 混合使用
static cell 与 dynamic cell 混合使用 关于静态cell与动态cell的混合使用,google一下便会有很多相关文章,这里也是看过一些前辈的经验(已经忘记具体是从哪篇文章得到的 ...
- EPANET头文件解读系列4——EPANET2.H
该头文件的功能与系列3中的TOOLKIT.H类似,而且内容也几乎一致,所以也就不再详细介绍.
- 关于apply、call和bind的总结
基础知识不是你看了一遍书或者两篇文章就能掌握的. 之前看书看文章时,感觉自己看懂了就掌握了.呵呵!too young!too naive! 以前的坑还是要一铲一铲的填上的. 高程上面关于apply和c ...
- linux查看端口对应的程序及pid
linux中查看特定端口对应的进程以及进程的pid可以使用下面指令: lsof -i:port_number 杀死进程的指令是: kill -s 9 pid
- 干掉某个用户的所有进程 ---slay和kill
要杀掉指定进程,你可以: 1.sudo slay <name> 知道进程名字即可 2.kill[参数][进程号] 知道进程ID即可 用‘slay’干掉某个用户的所有进程 slay 是Ch ...
- 20155315 2016-2017-2 《Java程序设计》第八周学习总结
教材学习内容总结 第14章 NIO与NIO2 1.认识NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区(Buffer)容量,在缓冲区中对感兴趣的数据区块进 ...
- flask第二十五篇——控制语句
有兴趣的请加船长公众号:自动化测试实战 先和大家强调一个发邮件的问题 # coding: utf-8 import smtplib from email.mime.text import MIMETe ...
- 【java多线程】ConCurrent并发包 - Lock详解
synchronized的缺陷 我们知道,可以利用synchronized关键字来实现共享资源的互斥访问. Java 5在java.util.concurrent.locks包下提供了另一种来实现 ...
- TypeScript学习笔记(三) - 方法
本篇将介绍在TypeScript里如何定义和使用方法. 一.方法标准声明和使用 // 方法声明 function func(x: number, y: number): number { return ...