代理自动配置文件PAC的使用方法

2024-04-01 05:18

本文主要是介绍代理自动配置文件PAC的使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意:

         1、微软从Internet Explorer(IE)11版本开始,已经弃用本地PAC文件的方式(也就是我们说的“file://”方式)配置自动代理了,只能通过http或者https方式加载代理自动配置的PAC文件

         2、 Chrome移除对file://和data:协议的支持,目前只能使用http://协议

         3、手动配置中的例外允许的大小为2068个字符,为查到此限制的文档,2068为实际验证的值,如下:

 

               

我通常上网使用两个浏览器,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的使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866286

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex