企业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文件内容

  1. function FindProxyForURL(url, host)
  2.  
  3. {
  4.  
  5. return "PROXY proxy.example.com:8080; DIRECT";
  6.  
  7. }

设计技巧

处理大小写

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

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

有效利用缩进

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

处理localhost和回送地址

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

  1. if ((host == "localhost") ||
  2. (shExpMatch(host, "localhost.*")) ||
  3. (host == "127.0.0.1")) {
  4. return "DIRECT";
  5. }

通过PAC屏蔽网站

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

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

合理使用变量

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

myip = myIpAddress();

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

  1. function FindProxyForURL(url, host) {
  2. // Set the default proxy variable that users get if they don’t match
  3. // any more specific rule.
  4. proxy = "PROXY coreproxy.company.com:8000";
  5.  
  6. // Los Angeles WAN subnets go to LA proxy
  7. if (isInNet(myIpAddress(), "10.100.0.0", "255.252.0.0")) {
  8. proxy = "PROXY la-proxy.company.com:8000";
  9. }
  10.  
  11. // New York WAN subnets go to New York proxy
  12. if (isInNet(myIpAddress(), "10.200.0.0", "255.252.0.0")) {
  13. proxy = "PROXY ny-proxy.company.com:8000";
  14. }

一般采用以上方式处理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使用的是那种协议,然后返回不同的代理。

  1. if (url.substring(0,4) == "http") {
  2.  
  3. return "PROXY http-proxy.company.com:8000";
  4.  
  5. } //matches HTTP and HTTPS URLs
  6. if (url.substring(0,3) == "ftp") {
  7.  
  8. return "PROXY ftp-proxy.company.com:8000";
  9.  
  10. } //matches FTP:// links
  11. if (url.substring(0,3) == "mms") {
  12.  
  13. return "PROXY http-proxy.company.com:8000";
  14.  
  15. } //matches MMS links

区分Text和Numeric

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

numvariable = parseInt(textvar);

负载均衡proxy

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

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

调试

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页面中然后通过浏览器打开,可以很容易的发现脚本中的语法错误。

  1. <html>
  2. <head>
  3. <script language="JavaScript">
  4.  
  5. Insert your ENTIRE PAC file here
  6.  
  7. </script>
  8. </head>
  9. <body>
  10. test
  11. </body>
  12. </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. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  2. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  3. 微软Azure 经典模式下创建内部负载均衡(ILB)

    微软Azure 经典模式下创建内部负载均衡(ILB) 使用之前一定要注意自己的Azure的模式,老版的为cloud service模式,新版为ARM模式(资源组模式) 本文适用于cloud servi ...

  4. ASP.NET Core project.json imports 是什么意思?

    示例代码: "frameworks": { "netcoreapp1.0.0": { "imports" : "portable- ...

  5. 谈谈JS中的函数节流

    好吧,一直在秋招中,都没怎么写博客了...今天赶紧来补一补才行...我发现,在面试中,讲到函数节流好像可以加分,尽管这并不是特别高深的技术,下面就聊聊吧! ^_^ 备注:以下内容部分来自<Jav ...

  6. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  7. LoadRunner函数百科叒叒叒更新了!

    首先要沉痛通知每周四固定栏目[学霸君]由于小编外派公干,本周暂停. 那么这周就由云层君来顶替了,当然要要说下自己做的内容啦,DuangDuang! <LoadRunner函数百科>更新通知 ...

  8. 餐饮连锁公司IT信息化解决方案一

             从餐饮企业的信息化需求来说,没有哪一种解决方案能满足所有餐饮企业的信息化建设需要.不同的餐饮业态有不同的业务流程,不同业态的信息化解决方案是目前餐饮企业信息化建设急需的,这种一站式整 ...

  9. Canvas讲解

    1.Canvas是什么? 简单地说canvas是画布,可以进行画任何的线.图形.填充等一系列的操作,而且操作的画图就是js, 提供简单的二维矢量绘图. 2.步骤: <canvas id=&quo ...

  10. 安装并使用PHPunit

    安装并使用PHPunit Linux 下安装PHPunit PHP 档案包 (PHAR)  要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包 (PHAR),它将 PHPU ...