zoukankan      html  css  js  c++  java
  • 代理自动配置文件PAC

    代理自动配置文件PAC

    来源 https://zhuanlan.zhihu.com/p/31287042

    chrome://net-export/
    chrome://net-internals/#proxy
    chrome://net-internals/#events
    https://netlog-viewer.appspot.com/

    https://github.com/MamoruAsagami/PacTestBench
    Usage: java -jar build/libs/PacTestBench.jar [options] pac-file url-list-file [>report.txt]

    注意: isInNet dnsResolve 会造成浏览器访问缓慢 

    代理自动配置(Proxy auto-config,PAC),该文件定义浏览器如何自动选择适当的代理服务区来访问一个网站。一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url,host)”,该函数可返回一个包含一个或者多个访问规则的字符串。浏览器或者其他应用可根据该字符串确定使用哪个代理服务器。

    PAC维基百科说明:点击查看

    官网functions说明:点击查看

    PAC文件简单格式:

    function FindProxyForURL(url, host) {
      if(shExpMatch(url,"*.baidu.com/*")){
      return "PROXY 127.0.0.1:8080";}
    }

    二、PAC文件可用Functions

    PAC文件可分析用户URL地址从而分配不同的代理服务器,不同的Functions可进行不同的判断。

    1)dnsDomainIs

    说明:如果访问的主机名(域名)匹配上,则返回true。只能使用host。

    示例:

    if(dnsDomainIs(host,"baidu.com")){
        return "DIRECT";}

    2)shExpMatch

    说明:将主机名或者URL地址与shell表达式进行匹配,成功则返回true。

    示例:

    if(shExpMatch(host,"baidu.com") || 
       shExpMatch(url,"http://*.sina.com/*")){
    return "DIRECT";}

    如果访问域名是或者url地址"http://*.*的,则直接进行访问

    3)dnsResolve

    说明:解析主机名为IP,此功能减少DNS查询次数。

    示例:

    if(isInNet(dnsResolve(host),"192.168.0.0","255.255.0.0"){
    return "DIRECT";}

    4)isInNet

    说明:匹配域名(或主机)的IP地址,如果在指定子网内,则返回true。如果匹配的是主机名,该函数会将该主机名解析为IP

    示例:

    if(isInNet(host,"192.168.21.0","255.255.255.0") || 
       isInNet(dnsResolve(host),"192.168.21.0","255.255.255.0")){
    return "DIRECT";}

    5)myIpAddress

    说明:返回本地主机的IP

    示例:

    if(isInNet(myIpAddress(),"192.168.107.0","255.255.255.0")){
    return "PROXY 127.0.0.1:8080";}

    6)isPlainHostName

    说明:如果主机名中不包含点(.),则返回true。该函数只用于host

    示例:

    if(isPlainHostName(host)){
    return "DIRECT";}

    7)localHostOrDomainIs

    说明:只有找到确切的主机名,才返回true。

    示例:

    if(localHostOrDomainIs(host,"wenku.my.com")){
    return "PROXY 127.0.0.1:90";}

    访问wenku.my.com,wenku.sina.com都会返回true,使用127.0.0.1:90的代理。因为主机名是wenku。

    8)isResolvable

    说明:如果主机名能解析为IP,则返回true。注意:如果主机名不能解析,可能会导致浏览器暂时挂起。

    示例:

    if(isResolvable(host)){
    return "DIRECT";}

    9)dnsDomainLevels

    说明:此函数会返回主机名的域级别数(.的数量)

    示例:

    if(dnsDomainLevels(host) > 1 && dnsDomainIs(host,"baidu.com")){
    return "PROXY 127.0.0.1:90;192.168.1.21:8080";} 

    10)weekdayRange

    说明:允许基于“周”时间的规则。MON,TUE,WED,THU,FRI,SAT,SUN

    示例:

    if(weekdayRange("MON","SUN")){
    return "DIRECT";}
    else {
    return "PROXY 127.0.0.1:90";}

    11)dateRange

    说明:允许基于“月”时间的规则。JAN,FEB,MARCH,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC

    示例:

    if(dateRange("JAN","SEP","JUN")){
    return "DIRECT";}

    12)timeRange

    说明:允许基于“小时”时间的规则。

    示例:

    if(timeRange(8,18) && weekdayRange("MON","TUE")){
    return "PROXY 127.0.0.1:90";}

    13)alert

    说明:原始PAC规范中没有这个函数,但有的浏览器是支持这个函数的。这可用用来纠正PAC文件错误。没测试成功。

    示例:

    if(timeRange(8,18) && weekdayRange("MON","TUE")){alert("IN Time!");}

    三、注意事项

    1)return 返回数据类型

    DIRECT 表示无代理直接访问

    PROXY Host:Port 表示通过Host:Port的proxy服务上网

    SOCKS Host:Port 表示通过Host:Port的socks服务上网

    2)return可进行串联

    例:return "PROXY 127.0.0.1:8080; SOCKS 127.0.0.1:9090; DIRECT";

    如果代理挂了或者访问超时,依次类推使用后边的配置。达到容灾目的。

    3)PAC文件被访问是,返回的文件类型(Content-Type)应该为:application/x-ns-proxy-autoconfig。如果不写,浏览器也能自动识别

    4)上述functions对大小写不敏感

    5)dnsResolve(host)是解析出来放到自己的缓存中,不过系统中也有存在缓存数据。

    6)https请求拿不到完整网址,只能使用主机名。(没做实验,这是网上评论)

    ========= End

  • 相关阅读:
    sas中一些小的选项的含义
    C++变量学习点
    sas,log,output,ods输出管理(html output_object output_statement)
    matlab统计函数
    sas条件判断语句where,if的区别,以及where选项
    sas数组,数组的语法与一些特殊定义,获取维度大小
    sas赋值语句,累加语句,keep,drop,rename,(retain/sum statement)
    解决Xcode 4.3.2的"Could not insert new outlet connection"问题
    网络数据的XML解析
    将UIView中的图像保存到相册
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/15201050.html
Copyright © 2011-2022 走看看