![有没有办法通过 URL 链接 proxy.pac 文件?](https://linux22.com/image/492023/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%80%9A%E8%BF%87%20URL%20%E9%93%BE%E6%8E%A5%20proxy.pac%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我们的几台笔记本电脑需要同时在我们自己的网络和客户网络上运行。这通常需要切换代理设置,我们最初是通过自定义的 proxy.pac 文件进行的(在您的帮助下)这里)。现在,我们使用的其中一个网络有自己的 proxy.pac,我们必须使用它,这意味着目前我们必须手动更改该网络的 proxy.pac 位置。
那么,有没有办法编写一个 proxy.pac,使得它在某些情况下推迟到另一个 proxy.pac ?
答案1
不,不是在静态 .pac 文件中。问题是,当第二个文件加载时,您最终会重新定义 FindProxyForURL() 函数,这会触发 javascript 解释器。
您需要开发一个动态页面(ASP、PHP 等),该页面将实现所需的逻辑,然后根据决策读取所需 .pac 文件的内容并将其返回给客户端。我曾经这样做过,以便在我位于不同物理位置的代理之间建立一些动态负载平衡,对我来说效果很好。
如果您选择采用这种方式,请确保您编写的脚本将返回的 mime 类型设置为 application/x-ns-proxy-autoconfig 或 application/x-javascript-config,否则您的浏览器将无法将其识别为 pac 文件。
答案2
在对 IE 没有快速简便的方法来关闭代理设置感到恼火之后,这个问题启发我用 PHP 编写了这个 PAC 文件。
它确定对文件的请求是从内部发出的(在这种情况下,使用代理服务器)还是从外部发出的:直接发出。也许有人可以根据自己的需要进行调整。
<?php
$proxy = "192.168.0.x";
$port = "8080";
header ("Content-type: application/x-ns-proxy-autoconfig");
header ("Date: " . gmdate('D, d M Y H:i:s \G\M\T', time ()));
header ("Last-Modified: " . gmdate('D, d M Y H:i:s \G\M\T', time ()));
header ("Expires: " . gmdate('D, d M Y H:i:s \G\M\T', time () + 60 * 30));
echo "// Request from: " . $_SERVER ['REMOTE_ADDR'] . "\n";
if (substr ($_SERVER ['REMOTE_ADDR'], 0, 8) == "192.168.")
{
?>
// We're inside the firewall
var external = false;
<?php
}
else
{
?>
// We're outside the firewall
var external = true;
<?php
}
?>
// Default connection
var direct = "DIRECT";
// Alternate Proxy Server
var proxy = "PROXY <?php echo $proxy; ?>:<?php echo $port; ?>";
//
// Proxy Logic
//
function FindProxyForURL(url, host)
{
if (external || isPlainHostName(host) || shExpMatch(host, "192.168.*") || (dnsDomainIs(host, ".example.com")) && !localHostOrDomainIs(host, "www.example.com") || dnsDomainIs (host, ".example2.com"))
{
return direct;
}
else
{
return proxy;
}
}
我现在已经调整了组策略设置,以便所有浏览器都指向位于防火墙内的 Web 服务器上的此文件。现在,如果笔记本电脑离开现场,其代理文件将自动更改,而无需重新配置浏览器的代理设置。
编辑:已更新以匹配本地 IP 地址主机...
答案3
您可以使用WPAD(Web代理自动发现)在不同的网络中分发不同的proxy.pac文件。
但你需要在每个网络中有一个简单的网络服务器,并且搜索 dhcp 提供的域在每个网络中必须不同。如果每个网络服务器在 URL 下托管不同的 proxy.pac 文件http://wpad[.dhcp-search-domain.com]/wpad.dat,那么您需要做的就是在浏览器的代理设置中设置“自动发现”,并在每次切换网络时重新启动浏览器。
如果您真的很幸运,您的客户已经有一个有效的代理自动发现,而您只是因为静态 proxy.pac 配置而错过了它......