企业IT管理员IE11升级指南 系列:

【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

【2】—— Internet Explorer 11 对Adobe Flash的支持

【3】—— IE11 新的GPO设置

【4】—— IE企业模式介绍

【5】—— 不跟踪(DNT)例外

【6】—— Internet Explorer 11面向IT专业人员的常见问题

【7】—— Win7和Win8.1上的IE11功能对比

【8】—— Win7 IE8和Win7 IE11对比

【9】—— IE10与IE11的功能对比

【10】—— 如何阻止IE11的安装

【11】—— 通过SCCM 2012和WSUS部署Internet Explorer 11

【12】—— 兼容视图列表介绍

【13】—— 如何把IEMP迁移到GPP

【14】—— IE11代理服务器配置

【15】—— 代理自动配置脚本

【16】—— 使用Compat Inspector快速定位IE兼容性问题

【17】—— F12 开发者工具

代理自动配置脚本

Contents

简介... 2

设计技巧... 2

处理大小写... 2

有效利用缩进... 3

处理localhost和回送地址... 3

通过PAC屏蔽网站... 3

合理使用变量... 3

慎用isInNet, isResolveable, dnsResolve方法... 4

IE PAC结果缓存... 4

使用Substrings. 4

区分Text和Numeric. 5

负载均衡proxy. 5

调试... 6

本地PAC测试... 6

通过alert()调试... 6

将PAC方法至于HTML页面中调试... 7

PAC文件下载... 7

参考... 7

简介

代理自动配置(Proxy auto-config,简称PAC) 是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来访问一个网址。

一个PAC文件包含一个JavaScript形 式的函数“FindProxyForURL(url, host)”。这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理其或者直接访问。 当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。 浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自发现协议(Web Proxy Autodiscovery Protocol)自动配置的。

要使用PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。

一个PAC文件是一个至少定义了一个JavaScript函数的文本文件。这个函数FindProxyForURL(url, host)有2个参数:url是一个对象的URL,host是一个由这个URL所衍生的主机名。按照惯例,这个文件名字一般是proxy.pac. WPAD标准使用wpad.dat.

虽然大多数客户端无论从HTTP请求返回的MIME类型是什么都能正确处理,但为了完整性和最佳的兼容性,我们应该设置网页服务器将这个文件的MIME类型声明为 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config .

没有什么理由偏爱一种MIME类型多一些,如果有的话,假设 application/x-ns-proxy-autoconfig 相对 application/x-javascript-config 被更多的客户端所支持是可以理解的。因为它被定义在最初的Netscape规范里面,后者是最近才开始被使用。

一个非常简单的PAC文件内容

function FindProxyForURL(url, host) 

{ 

        return "PROXY proxy.example.com:8080; DIRECT"; 

}

设计技巧

处理大小写

有些浏览器对大小写敏感,例如www.microsoft.com与WWW.MICROSOFT.COM被认为是不同的主机。如果想忽略大小写,通常情况下可以将参数转换为小写之后进行使用。

var lhost = host.toLowerCase();
host = lhost;

有效利用缩进

有效利用缩进可以提高pac文件的阅读性和可维护性,对于缩进一条简单的规则是花括号之后缩进一个制表符,匹配的花括号之间对齐。

处理localhost和回送地址

localhost和回送地址(127.0.0.1)应该直接跳过代理,可以参考以下逻辑。

 if ((host == "localhost") ||
(shExpMatch(host, "localhost.*")) ||
(host == "127.0.0.1")) {
return "DIRECT";
}

通过PAC屏蔽网站

通过PAC文件可以很容易的屏蔽网站,做法是直接返回一个回送地址使得请求无法送出,这样还可以节省客户端到代理之间的带宽。唯一需要注意的一点是不要将请求发送给本地正在监听的端口。

if (dnsDomainIs(host, ".badspyware.com") ||
dnsDomainIs(host, ".worsespyware2.com")) {
return "PROXY 127.0.0.1:48890";
}

合理使用变量

在PAC文件中合理定义变量可以优化执行效率,增加代码可读性。例如通过以下方式定义变量myip来缓存本地ip地址,这样就避免每次都调用相同方法来查询本地ip。

myip = myIpAddress();

另外一种常见的用法是将准备返回的proxy定义变量,然后随着程序逻辑对其进行更改。

function FindProxyForURL(url, host) {
// Set the default proxy variable that users get if they don’t match
// any more specific rule.
proxy = "PROXY coreproxy.company.com:8000"; // Los Angeles WAN subnets go to LA proxy
if (isInNet(myIpAddress(), "10.100.0.0", "255.252.0.0")) {
proxy = "PROXY la-proxy.company.com:8000";
} // New York WAN subnets go to New York proxy
if (isInNet(myIpAddress(), "10.200.0.0", "255.252.0.0")) {
proxy = "PROXY ny-proxy.company.com:8000";
}

一般采用以上方式处理proxy时,逻辑上会先处理最通用的情况然后再处理特殊的情况,最终返回proxy的当前值给浏览器。

return proxy;

慎用isInNet, isResolveable, dnsResolve方法

很多PAC开发人员经常使用isInNet(host,”a.b.c.d”)是否位于某ip段中,但是该方法的调用会使浏览器为每个主机名发送dns反向查询请求。如果一个网络中有很多客户端都在发送类似请求,将大大增加dns服务器的负载。

IE PAC结果缓存

IE的PAC处理存在一个与其他浏览器较大的不同之处,在于IE浏览器会将PAC的处理结果缓存,即可以认为是对于每个host,PAC文件只执行一次,直到下次重启IE才会重新执行。这样就会导致一些PAC逻辑看起来不能正常工作,例如需要通过url中的非host信息来返回不同的代理。

IE PAC结果缓存可以通过以下注册表禁用

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings
Value: EnableAutoproxyResultCache
Type: REG_DWORD
Data value: 0 = disable caching; 1 (or key not present) = enable automatic proxy caching (this is the default behavior)

使用Substrings

如正常的JavaScript方法一样,可以通过使用Substring来判断url或host中部分字符串是否满足特定条件,从而处理不同逻辑,一种比较常见的用法是判断url使用的是那种协议,然后返回不同的代理。

if (url.substring(0,4) == "http") { 

return "PROXY http-proxy.company.com:8000"; 

}  //matches HTTP and HTTPS URLs
if (url.substring(0,3) == "ftp") { return "PROXY ftp-proxy.company.com:8000"; } //matches FTP:// links
if (url.substring(0,3) == "mms") { return "PROXY http-proxy.company.com:8000"; } //matches MMS links

区分Text和Numeric

注意字符串类型和数字类型的区别,例如“92”是字符串,如果需要使其变为数字类型,需要调用parseInt方法。

numvariable = parseInt(textvar);

负载均衡proxy

很多机构内部有多个代理服务器,但并没有通过负载均衡器来对代理服务器进行负载管理。通过PAC文件可以通客户端逻辑进行简单的负载均衡。

// Find the 4th octet
var myip=myIpAddress()
var ipbits=myip.split(".")
var myseg=parseInt(ipbits[3]) // Check to see if the 4th octect is even or odd
if (myseg==Math.floor(myseg/2)*2) {
// Even
proxy = "PROXY p1.company.com:8080; PROXY p2.company.com:8080";
}
else {
// Odd
proxy = "PROXY p2.company.com:8080; PROXY p1.company.com:8080";
}

调试

PAC文件的编写难免需要进行测试和调试,例如你在编写过程中出现了JavaScript语法错误,或者有些方法返回了意想不到的结果。很多浏览器并没有提供对于PAC脚本调试的支持,对于PAC文件调试也需要一些技巧。

本地PAC测试

有些情况下PAC文件看上去完全没有起作用,我们可以通过将PAC文件下载到本地,并通过本地文件的方式来访问该PAC文件进行测试。

注意在IE11中默认禁用了本地PAC文件,进行本地PAC文件测试需要更改以下注册表项,

Key:   HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\
Value: EnableLegacyAutoProxyFeatures
Type:  REG_DWORD
Data:  1

通过alert()调试

通过添加alert()方法可以有效的帮助调试,例如myIpAddress()取得了一个错误的地址,通过alert方法可以很容易的发现类似问题。

if ((host =="proxyinfo.company.com")) {
    alert("Local IP address is: " + myIpAddress());
}

alert也可以帮助定位脚本语法错误,例如在不同的逻辑路径上进行alert,正确情况下会弹四个对话框,但最终仅仅弹出三个,那么我们可以判断在第三个于第四个alert之间可能存在语法错误。

将PAC方法至于HTML页面中调试

将PAC文件的function FindProxyForURL(url, host)方法置于html页面中然后通过浏览器打开,可以很容易的发现脚本中的语法错误。

<html>
<head>
<script language="JavaScript"> Insert your ENTIRE PAC file here </script>
</head>
<body>
test
</body>
</html>

PAC文件下载

由于PAC文件通常被放在一个Web服务器上,一个常见的问题就是下载问题,判断是否存在PAC文件下载问题,可以通过浏览器直接输入PAC地址尝试下载来查看是否能够下载成功。

参考

http://en.wikipedia.org/wiki/Proxy_auto-config

http://www.proxypacfiles.com/proxypac/

http://technet.microsoft.com/library/Dd361918

http://findproxyforurl.com/

http://support.microsoft.com/kb/271361

企业IT管理员IE11升级指南【15】—— 代理自动配置脚本的更多相关文章

  1. 企业IT管理员IE11升级指南【14】—— IE11代理服务器配置

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  2. 企业IT管理员IE11升级指南【17】—— F12 开发者工具

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  3. 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. 企业IT管理员IE11升级指南【2】—— Internet Explorer 11 对Adobe Flash的支持

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  6. 企业IT管理员IE11升级指南【3】—— IE11 新的GPO设置

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  7. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  8. 企业IT管理员IE11升级指南【5】—— 不跟踪(DNT)例外

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  9. 企业IT管理员IE11升级指南【6】—— Internet Explorer 11面向IT专业人员的常见问题

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

随机推荐

  1. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  2. C++中的变长参数

    新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...

  3. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  4. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  5. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  6. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  7. BPM助力企业数字化转型

    自九十年代末,流程管理开始引入国内,至今已经有20多年的历史了,由最初的部门级应用向企业级应用转变,大家的认知也经历了一系列的发展变化.不同阶段的信息化水平对企业的流程以及BPM平台也提出了不同的需求 ...

  8. win10上部署Hadoop-2.7.3——非Cygwin、非虚拟机

    开始接触Hadoop,听人说一般都是在Lunix下部署Hadoop,但是本人Lunix不是很了解,所以Google以下如何在Win10下安装Hadoop(之后再在Lunix下弄),找到不少文章,以下是 ...

  9. 用Swagger生成接口文档

    Swagger简介 在系统设计的时候,各个应用之间往往是通过接口进行交互的.因此接口的定义在整个团队中就变得尤为重要.我们可以把接口的规范用接口描述语言进行描述,然后Swagger可以根据我们定义的接 ...

  10. vim环境变量配置、背景色配置

    我们使用vi或者vim的时候,如果想要显示行号,可能会这样做:切换到命令模式,然后输入set nu,再按回车键就显示了:还有就是咱们在编写程序的时候,有的时候会希望按下回车键后,光标不是每次都在行首, ...