【问题标题】:How to discover the proxy used from a Proxy Autoconfiguration file?如何从代理自动配置文件中发现使用的代理?
【发布时间】:2010-06-18 10:09:37
【问题描述】:

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

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

【问题讨论】:

  • 抱歉没有更清楚。它不起作用,因为 javascript 错误 isInNet 未定义。
  • 请注意,我必须从 pac 文件中找到代理服务器,而这个工具:code.google.com/p/pacparser 工作得很好。
  • 谷歌链接现在只转发到this github page。你也可以考虑这个(在线!)工具:app.thorsen.pm/proxyforurl。此外,您也可以只查看something.pac的内容,它只是纯文本。

标签: firefox proxy


【解决方案1】:

.pac 文件只是一个 ECMAscript - 也就是 JavaScript。在文件格式上查看the wikipedia article

如果您复制 PAC 代码,您可以对其进行处理,以根据目标 url 查看正在使用的代理。如果你觉得花哨,你可以将脚本包装到一个网页中(本地),以创建一个在本地评估的工具。

编辑:

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

如果您有可用的 .Net 并且对使用 C# 感兴趣,那么您可以查看 this article on MSDN,其中包含您可以以与上述类似的方式使用的代码。

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

如果您在 Microsoft 环境中工作,那么您可以查看 this page on Technet,它通过一些有用的示例描述了 .pac 格式。

根据isInNet() 的 Microsoft 文档:

如果主机 IP 地址与指定的 pattern 匹配,isInNet(host, pattern, mask) 函数将返回 TRUEmask 表示要匹配 IP 地址的哪一部分(255=匹配,0=忽略)。

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

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 }

希望有帮助!

【讨论】:

  • 我已经下载了它并将 .pac 文件添加到本地网页。我尝试使用 Firebug 进行调试,但存在某些未知函数,例如 myIpAddress()(我创建它以返回我的 ip)或 isInNet()。
  • 希望扩展的答案有所帮助 - 您可能会在我包含的 mozilla 链接上阅读更多源代码 - 它会给您其他相关功能(或找到它们的链接)。
【解决方案2】:

我已经创建了简单的 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>

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

【讨论】:

  • 如果我可以让它工作,这看起来很棒......但是在这条线之前和之后发出警报var test = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/(ipaddr); 似乎这条线打破了它......它出现的同一行在实际的 Mozilla 文件中,所以我猜它是对的,但看着这个 w3schools.com/js/js_obj_regexp.asp 似乎不正确。将行更改为 var test1 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/i; var test = test1.exec(ipaddr); 似乎可以解决问题...您的想法?
  • 在Windows上myIpAddress()的值是DOS命令ipconfig返回的IP?
  • 为什么是“Host and URL”表单?我需要使用代理浏览所有互联网...我使用我的客户端 IP,如何填写主机和 URL?
猜你喜欢
  • 2010-12-23
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多