PAC⾃动代理⽂件格式,教你如何写PAC⽂件
前些天,同事给我抱怨,公司的GPO强制更改了笔记本的IE代理服务器,在办公室还好,⼀回家就上不了⽹了,必须⼿动更改代理设置,真是⿇烦。我想了想,proxy.pac⾃动代理⽂件应该可以解决这个问题,于是想到就做。
Proxy.pac⽂件的本质是javascript的⼀个函数,通过设定各种条件(域名,IP等等),从⽽让浏览器加载的时候⾃动去寻对应的代理服务器。⽐如说
function FindProxyForURL(url, host) {
if(isInNet(myIpAddress(), "10.71.80.0", "255.255.255.0")){
return"PROXY 112.186.227.85:8080";
}
return"DIRECT";
}
当浏览器加载这个proxy.pac⽂件之后,就会⾃动⽐较⾃⼰的IP地址,如果属于10.71.80.0/24 这个范围,那么他就使⽤代理服务器112.186.227.85:8080,否则直接连接⽹络。
以IE为例,可以在Option->Connection->LAN setting 中进⾏设置。注意IE的格式是
[url=file:///C:/proxy.pac]file://c:/proxy.pac[/url], ⽽在某些浏览器⾥⾯需要改成
[url=file:///C:/proxy.pac]file:///c:/proxy.pac[/url]
Proxy.pac⽂件写好以后,就需要配置在⼀个共享的服务器上以供下载。我把他放在⽂件服务器fileserver的⼀个共享⽂件夹中,我的思路是域⽤户登录客户机时,⾃动下载proxy.pac到本地⽂件夹中,同时通过配置GPO中的IE选项让IE绑定该⽂件。
我了⼀个现成的vb脚本下载,稍加改动路径以便满⾜⾃⼰的需要。同时因为我要把⽂件拷贝到
C:\WINDOWS\system32\drivers\etc\,默认普通⽤户是没有权限访问的,我还必须更改这个⽂件夹的权限。
Copy.vbs
Option Explicit
Dim WshShell
Dim fso
Dim USERPROFILE
Dim srcPath
Dim tgtPath
Dim computername
On Error Resume Next
Set WshShell =WScript.CreateObject("Wscript.Shell")
Set fso =WScript.CreateObject("Scripting.FilesystemObject")
USERPROFILE =WshShell.ExpandEnvironmentStrings("%USERPROFILE%")
'Set wshShell = WScript.CreateObject("WScript.Shell" )
'computername= wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%" )
'WScript.Echo "Computer Name: " & computername
srcPath = "\\fileserver\it\proxy\proxy.pac"
tgtPath = "C:\WINDOWS\system32\drivers\etc\proxy.pac"
If Not fso.FileExists(tgtPath) Then
fso.CopyFile srcPath, tgtPath, True
'ho "Copy to "+tgtPath
ElseIf fso.FileExists(srcPath) Then
ReplaceIfNewer srcPath, tgtPath
End If
Sub ReplaceIfNewer(strSourceFile, strTargetFile)
Const OVERWRITE_EXISTING = True
Dim objFso
Dim objTargetFile
Dim dtmTargetDate
Dim objSourceFile
Dim dtmSourceDate
Set objFso =WScript.CreateObject("Scripting.FileSystemObject")
Set objTargetFile = objFso.GetFile(strTargetFile)
dtmTargetDate = objTargetFile.DateLastModified
Set objSourceFile = objFso.GetFile(strSourceFile)
dtmSourceDate = objSourceFile.DateLastModified
If (dtmTargetDate < dtmSourceDate) Then
objFso.CopyFile objSourceFile.Path,objTargetFile.Path,OVERWRITE_EXISTING
End If
Set objFso = Nothing
End Sub
最后是GPO配置结果
⼀个是针对⽂件夹权限的,需要在⽤户电脑的OU配置
⼀个是⽤户的登录脚本,⽐较更新时间下载最新版本的proxy.pac,同时绑定IE
经测试,在我的TMG代理服务器上能够成功检测到连接的客户session。客户机访问My IP显⽰的也是代理服务器的公⽹地址。Done!
PAC⽂件格式
PAC⽂件是纯⽂本格式的,实际上就是JavaScript⽂件。Chrome/Chromium的扩展Switchy!的"Auto Switch Mode"功能实际上也是创建和维护⼀个简单的PAC⽂件,但功能⽐较弱。
对于⼀般的应⽤,即使你⼏乎不懂JavaScript和编程,也可以通过本⽂的介绍实现基本的功能。
PAC⽂件FindProxyForURL函数
PAC⽂件中必须包含⼀个函数:FindProxyForURL(url, host)。
参数url是⽤户输⼊的url,参数host是url中的主机名。
⼀个最简单的PAC⽂件内容如下:
function FindProxyForURL(url, host){
return"DIRECT";
}
这个PAC⽂件实际上什么也没做,对任何URL,都将"DIRECT"(直接连⽹)。
PAC⽂件返回值类型
除了可以return "DIRECT"以外,还有两种常⽤⽅式:
PROXY proxysample:8080
http代理的主机和端⼝,主机也可以⽤IP表⽰
SOCKS5 socks5sample: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:1080";
}
这句语句的意思是:
1. 对所有URL,都直接连接;
怎样设置代理服务器2. 如果不能直接连接,那么就使⽤192.168.1.1:3128这个http代理连接;
3. 如果还是不能连接,则使⽤lilinux:1080这个socks5代理连接。
使⽤不同连接的顺序和语句中的顺序⼀致,你可以根据⾃⼰的实际情况更改。
也许你明确知道哪些⽹站不能直连,必须⽤PROXY或者SOCKS5连接,那么可以对站点分别指定代理配置
function FindProxyForURL(url, host){
if(shExpMatch(url,"*.google/*")){
return"PROXY 192.168.1.1:3128";
}
if(shExpMatch(url,"*.wikipedia:*/*")){
return"SOCKS5 lilinux:1080";
}
if(isInNet(host,"10.0.0.0","255.0.0.0")){
return"DIRECT";
}
return"DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux:1080";
}
这个PAC⽂件中引⼊了两个新的函数,但从字⾯意思上,我们也可以猜出代码的⼤概意思:
1. 当url是*.google/* 时,⾃动使⽤PROXY代理;
2. 当url是*./*时,⾃动使⽤SOCKS5代理;
3. 当host是10.0.0.0 /255.0.0.0的⼦⽹内时,⾃动直连;
4. 如果都不匹配,则依次按DIRECT、PROXY、SOCKS5的次序尝试。
shExpMatch函数⽤来匹配url或者host,匹配的⽅式和DOS的通配符相似。例如前⾯⽤到的"*.google/*"可以匹配任意包
含".google/"的字符串。
Chrome/Chromium 的扩展Switchy!创建的pac⽂件还⾃定义了⼀个函数,可以⽤来匹配正则表达式,不过个⼈认为在url匹配上通常不需要使⽤强⼤的正则表达式。
isInNet函数⽤来返回请求的host是否在指定的域内。值得注意的是,isInNet的第⼆个参数必须是 IP,不能是主机名。因此需要把主机名转换成IP。⽐如"isInNet(host, dnsResolve(), "255.255.255.0")"讲到这⾥,应该可以解决你的问题了吧。
PAC⽂件可以使⽤的JavaScript函数
你也许想把pac⽂件发布到Internet上,这样其它⽤户就只需要在浏览器中指定pac⽂件的url即可。你得配置你的服务器映射 .pac ⽂件后缀到MIME类型: application/x-ns-proxy-autoconfig 如果使⽤的是Netscape服务器,编辑 config ⽬录下的 pes ⽂ 件。如果是Apache, CERN or NCSA服务器,使⽤ AddType 指令。
-- EOF-TRUEVUE --
要发表评论,请先
29901 次阅读
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论