如何发现pac中使用的de proxy

Kir*_*Ape 8 firefox proxy

在FireFox中,互联网连接是通过代理自动配置文件"something.pac"进行的

我如何知道某个URL正在使用哪个代理服务器?

谢谢.

AJ.*_*AJ. 7

.pac文件只是一个emca脚本 - 又名JavaScript.查看有关文件格式的维基百科文章.

如果您复制PAC代码,则可以根据目标URL处理它以查看正在使用的代理.如果您感觉很花哨,可以将脚本包装到网页(本地)中,以创建一个在本地评估的工具.

编辑:

作为我开始推荐的方法的替代方法,您可以查看Google Code上提供的PACTester.这将允许您快速测试一系列选项.

如果您有.Net可用并且有兴趣使用C#,那么您可以在MSDN上查看这篇文章,其中包含您可以使用与上述类似的代码.

为了扩展上面概述的原始方法,主机浏览器可以(并且通常是)提供许多功能.必须在pac文件中实现的基本功能是FindProxyForUrl().这接受两个参数:url和host(从url名称派生的主机).所述"提供"的功能包括:isInNet(),localHostOrDomainIs(),isPlainHostName(),isResolvable(),等.

如果您在Microsoft环境中工作,那么您可以在Technet上查看此页面,该页面描述了.pac格式以及一些有用的示例.

根据Microsoft文档isInNet():

如果主机IP地址与指定的IP地址匹配,则isInNet(host, pattern, mask)返回此函数.的指示,以匹配该IP地址的一部分(255 =匹配,0 =忽略).TRUEpatternmask

如果您想获得技术,这里是用于实现代理自动配置相关服务的Mozilla源代码.它指定JS代码为isInNet():

200 function isInNet(ipaddr, pattern, maskstr) {
201     var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
202     if (test == null) {
203         ipaddr = dnsResolve(ipaddr);
204         if (ipaddr == null)
205             return false;
206     } else if (test[1] > 255 || test[2] > 255 ||
207                test[3] > 255 || test[4] > 255) {
208         return false;    // not an IP address
209     }
210     var host = convert_addr(ipaddr);
211     var pat  = convert_addr(pattern);
212     var mask = convert_addr(maskstr);
213     return ((host & mask) == (pat & mask));
214     
215 }
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 我已下载并将.pac文件添加到本地网页.我尝试使用Firebug进行调试,但是有一些未知的函数,比如myIpAddress()(我创建它以返回我的ip)或isInNet(). (2认同)

Vit*_*kov 6

我创建了简单的HTML页面解析代理:

<html>
<head>
    <script type="text/javascript">
    function myIpAddress() {
        return "192.168.1.2"; // Your IP
    }

    function isInNet(ipaddr, pattern, maskstr) {
        var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr);
        if (test == null) {
            ipaddr = dnsResolve(ipaddr);
            if (ipaddr == null) return false;
        } else if (test[1] > 255 || test[2] > 255 || test[3] > 255 || test[4] > 255) {
            return false;    // not an IP address
        }
        var host = convert_addr(ipaddr);
        var pat  = convert_addr(pattern);
        var mask = convert_addr(maskstr);
        return ((host & mask) == (pat & mask));
    }

    function dnsResolve(host) {
        try {
            return dns.resolve(host, 0).getNextAddrAsString();
        } catch (e) {
            return null;
        }
    }

    function convert_addr(ipchars) {
        var bytes = ipchars.split('.');
        var result = ((bytes[0] & 0xff) << 24) |
                     ((bytes[1] & 0xff) << 16) |
                     ((bytes[2] & 0xff) <<  8) |
                      (bytes[3] & 0xff);
        return result;
    }

    function isPlainHostName(host) {
        return host.search('\\\\.') == -1;
    }

    function shExpMatch(url, pattern) {
       pattern = pattern.replace(/\\./g, '\\\\.');
       pattern = pattern.replace(/\\*/g, '.*');
       pattern = pattern.replace(/\\?/g, '.');
       var newRe = new RegExp('^' + pattern + '$');
       return newRe.test(url);
    }

    function dnsDomainIs(host, domain) {
        return host.length >= domain.length && host.substring(host.length - domain.length) == domain;
    }
    </script>

    <!-- Your proxy script -->
    <script type="text/javascript" src="webproxy.js"></script>
</head>
<body>
    Host: <input id="host"/><br/>
    URL: <input id="url"/><br/>
    Proxy: <input id="proxy" disabled="disabled"/><br/>
    <input type="button" value="Resolve"
           onclick="document.getElementById('proxy').value = FindProxyForURL(document.getElementById('host').value, document.getElementById('url').value)"/><br/>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

myIpAddress等的代码我是从mozilla来源获得的.