代理自动配置文件PAC的使用方法
我通常上网使用两个浏览器,safari用于一般上网;Chrome安装SwitchyOmega插件,在不同的代理中切换,来保证某些网站的上网速度。
但是这种方式到了手机上就有点懵,几乎所有的iPhone浏览器都不支持代理的自动切换和设置,所以只能选一个相对兼容性比较好的网络方式一直用下去。很不爽利。。。
后来发现代理自动配置文件PAC是个好东西,跟SwitchyOmega类似,能够比较智能的切换所需,所以给大家推荐一下。
通常设备上网的设置,都有3个选项,1是直接连接,不使用代理;2是自行设置http代理;3是使用代理自动配置文件URL。
这个URL指向的就需要是一个PAC文件。如果在电脑上,可以是file:///这种形式指向本地的文件。如果是手机上,则只能放到一个可以http访问的服务器上。
PAC文件本质是js的一个子集,其中必须实现一个函数:
function FindProxyForURL(url, host)
两个参数,url是将要访问的网络地址,host是从url中分离出来的主机名。
每次浏览器访问任何一个网址的时候,都会调用这个脚本,根据脚本的返回值,选择浏览器使用哪个代理来访问互联网。
FindProxyForURL函数返回的访问方式,可以支持三种:
DIRECT
直接访问,不适用任何代理
PROXY host:port
设置http代理,host是代理主机,port是代理端口
SOCKS host:port
使用SOCKS代理模式,后面是主机及端口号
这三种方式,前两种是所有浏览器都支持的。第三种SOCKS,有的浏览器会解释为SOCKS5,有的浏览器会解释为SOCKS4,还有的浏览器还另外提供了SOCKS5方式。在mac Safari浏览器上及iPhone中是将SOCKS解释为SOCKS5协议。
对于PAC所使用的js语言的语法,不同浏览器的支持也不一样。IE支持完整的js语法,甚至alert命令弹出窗口都支持。Safari则严格遵循PAC的规范,仅支持简单局部变量的赋值和if语句及return语句。
所以通常安全起见,如果你的PAC文件会用在很多场合,最好考虑兼容性然后再编写。
PAC所支持的函数并非通常浏览器中的函数,详细内容可以参考这个网址。
具体PAC脚本的编写方法我们参考完成的脚本来解释:
function FindProxyForURL(url, host)
{
url = url.toLowerCase();
host = host.toLowerCase();
if (shExpMatch(url,"*twitter*") ||
shExpMatch(url,"*facebook*") ||
shExpMatch(url,"*fb*") ||
shExpMatch(url,"*messenger*")) {
return "PROXY 192.168.1.1:8080; DIRECT";
};
if (shExpMatch(url,"*youtube*") ||
shExpMatch(url,"*google*")){
return "PROXY 192.168.1.2:8080; DIRECT";
};
if (shExpMatch(url,"*wikipedia*") ||
shExpMatch(url,"*blogspot*") ||
){
return "PROXY 192.168.1.3:8080; DIRECT";
}
return "DIRECT";
}
shExpMatch是PAC专用的函数之一,判断url中是否包含某个网址,"*"是通配符的意思,表示url两端可以有任意字符,只要中间部位匹配成功即可。3组条件各自返回一个代理,都不能匹配,使用DIRECT直连。
PROXY 192.168.1.1:8080; DIRECT
是用分号隔开的两个代理模式,如果前面的代理协议本浏览器不支持的话,使用后面的协议。
所以类似SOCKS的协议,可以写成:
SOCKS5 192.168.1.1:8081; SOCKS 192.168.1.1:8082; DIRECT
这表示如果浏览器支持SOCKS5命令,则使用第一个协议;如果不支持SOCKS5命令,使用第二个SOCKS协议,实际在iPhone这就代表SOCKS5;前面两个都不支持,则DIRECT。
PAC中支持的函数有好几个,另外两个可能常用到的是:isInNet和dnsResolve,来看一个例子:
if (isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))){
return "DIRECT"
}
刚才说过了,host是自url中分离出来的主机网址,首先使用dns解析为IP地址,然后判断是否属于给定的网段。如果是,则返回直连,表示这个网段不通过代理来访问。
上面举例的PAC完整文件的例子,是我使用的PAC文件,其中使用了相反的逻辑。是某几个网站则使用相应代理,否则全部直连。所以没有使用isInNet和dnsResolve函数。但很多人习惯的时候还是会用到。
使用这种方式后,在iPhone可以愉快的上网,当然仍然有些情况没办法解决。比如facebook app,并没有使用http/https类的协议,而是直接使用tcp/ssl的链接获取数据。这种情况下设置代理和使用PAC都是无效的,目前没有什么好办法。着急的时候可以使用手机浏览器访问https://m.facebook.com来对付对付,体验方面,肯定差多了。
参考资料:
https://zhiwei.li/text/2015/08/16/用代理自动配置文件pac给iphone和ipad设备添加socks代理/
代理自动配置文件PAC的使用方法的更多相关文章
- PAC(Proxy Auto Config)代理自动配置文件的编写
Proxy Auto Config文件格式说明 PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处: 分散Proxy的流量,避 ...
- 详解代理自动配置 PAC
转自知乎 最近一直在做跨域中华局域网的工作,了解了很多代理知识和基础概念,很零散,也很细碎.希望通过一段时间的学习,能够自由地穿梭在国际互联网和中华局域网之间.后续会写一系列文章记录我了解到的知识点, ...
- PAC 代理自动发现简介
一 简介 1.1 什么是PAC文件 代理自动配置(PAC)文件包含一组用javaScript编码的规则,允许web浏览器确定是将Web流量直接发送到Internet还是通过代理服务器发送 ...
- 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得
[讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得 prerouting 发表于 2010-5-9 16:50:46 https://www.itsk.com/thread-36634- ...
- java根据xml配置文件导出excel通用方法
java web项目中时常会用到导出功能,而导出excel几乎是每个项目必备的功能之一.针对形形色色的导出方法及个人平时的工作经验,特将导出excel方法整理成通用的方法,根据xml配置来实现特定的导 ...
- 【log4j2 加载配置文件】 加载配置文件的三种方法
log4j 2读取的配置文件可以分为三类:src下的配置文件.绝对路径的配置文件.相对路径的配置文件. package com.herman.test; import java.io.File; im ...
- Linux 每天自动备份mysql数据库的方法
Linux 每天自动备份mysql数据库的方法 作者: 字体:[增加 减小] 类型:转载 linux下为了安全有时候需要自动备份mysql数据库,下面是具体的实现步骤. /usr/bin为my ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
随机推荐
- 在VUE-CLI 3下的第一个Element-ui项目(菜鸟专用)
vue-cli3.0使用及配置 (https://www.cnblogs.com/xzqyun/p/10779891.html ) 以上是 vue-cli3.0使用及配置 这里我们来引用基于v ...
- Hadoop的数据压缩
一.Hadoop的数据压缩 1.概述 在进行MR程序的过程中,在Mapper和Reducer端会发生大量的数据传输和磁盘IO,如果在这个过程中对数据进行压缩处理,可以有效的减少底层存储(HDFS)读写 ...
- json劫持payload
<html> <head>jsonp hijacking</head> <body> <script> function jj(json){ ...
- SOAPA来临,SIEM时代终结?
安全信息和事件管理(SIEM)产品及服务负责从大量企业安全控件.主机操作系统.企业应用和企业使用的其他软件中收集安全日志数据,并进行分析和报告.有些SIEM还可以试图阻止它们检测到正在进行的攻击,这可 ...
- scrapy初始和简单应用
什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有 ...
- spring 应用
Spring框架本身会托管bean. 1.使用时需要注意对于包本身扫描配置. 2.使用注解本身包需要在扫描路径下.
- CF741C.Arpa’s overnight party and Mehrdad’s silent entering [构造 二分图染色]
CF741C - Arpa's overnight party and Mehrdad's silent entering 题意: 有 n 对情侣坐成一个圈,有两种食物Kooft and Zahre- ...
- pyenv global 设置失败 pyenv local 设置就成功了 不知道啥原因
dev@PC-20190309QPVT:/mnt/c/data/htdocs/python/flaskr$ pyenv global 3.6.1dev@PC-20190309QPVT:/mnt/c/d ...
- JdbcTemplate实体映射
JdbcTemplate实体映射 如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你. 一个例子入门 下面是一个将表中一行记录映射成Map的例子,也是Jdb ...
- promise的异步链式调用
场景: 淘米 干净的米下锅 蒸米饭 吃米饭 ;这几个步骤是一个接着一个执行, 也就是只有前面的做完后, 才会去做后面的. 并且每一步都需要用一部分时间去执行. function deal(ta ...