我正在尝试为我的 Squid 制作一个代理 pac 文件。我想在用户在我的网络中或在家中时更改重定向,我尝试使用我的地址()功能。
我已经测试了这个 PAC,它具有我们可以在 PAC 中使用的大多数功能:http://findproxyforurl.com/debug-pac-file/ 。
function FindProxyForURL(url, host) {
debugPAC ="PAC Debug Information\n";
debugPAC +="-----------------------------------\n";
debugPAC +="Machine IP: " + myIpAddress() + "\n"; <-----|
debugPAC +="Hostname: " + host + "\n";
if (isResolvable(host)) {resolvableHost = "True"} else {resolvableHost = "False"};
debugPAC +="Host Resolvable: " + resolvableHost + "\n";
debugPAC +="Hostname IP: " + dnsResolve(host) + "\n";
if (isPlainHostName(host)) {plainHost = "True"} else {plainHost = "False"};
debugPAC +="Plain Hostname: " + plainHost + "\n";
debugPAC +="Domain Levels: " + dnsDomainLevels(host) + "\n";
debugPAC +="URL: " + url + "\n";
// Protocol can only be determined by reading the entire URL.
if (url.substring(0,5)=="http:") {protocol="HTTP";} else
if (url.substring(0,6)=="https:") {protocol="HTTPS";} else
if (url.substring(0,4)=="ftp:") {protocol="FTP";}
else {protocol="Unknown";}
debugPAC +="Protocol: " + protocol + "\n";
// Reduce volume of alerts to a useable level, e.g. only alert on static text pages.
if (!shExpMatch(url,"*.(js|xml|ico|gif|png|jpg|jpeg|css|swf)*")) {alert(debugPAC);}
return "DIRECT";
}
但是在输出中,我有 ipv6 地址?!
PAC-alert: PAC Debug Information
-----------------------------------
Machine IP: fe80::xxx:xxx:xxxx:xxxx <-----|
Hostname: download.cdn.mozilla.net
Host Resolvable: True
Hostname IP: 93.184.221.133
Plain Hostname: False
Domain Levels: 3
URL: http://download.cdn.mozilla.net/pub/firefox/releases/37.0.2/update/win32/fr/firefox-37.0.2.complete.mar
Protocol: HTTP
这正常吗?或者还有其他方法可以获取用户的 ipv4 地址?如果是这样,我无法进行如下测试:
if ( isInNet(myAddress, "10.0.0.0","255.0.0.0") ) ?
感谢您的帮助
答案1
该myIpAddress
函数基于主机仅有一个地址的假设。但这从来都不是一个有效的假设。
更好的替代方案是使用返回 IP 地址列表的函数。微软似乎已经推出了自己的扩大正是这样做的。
返回提供最有用信息的地址是有意义的myIpAddress
。但是你不能依赖它。有报告称,myIpAddress
有时返回的127.0.0.1
地址大多是无用的。
在您的情况下,它显然也没有做出最佳选择,因为对于 PAC 脚本来说,链路本地地址包含的有用信息比本地或全局地址少。我猜,在您的情况下,主机确实至少有一个可以返回的本地或全局地址。
总的来说,我最好的建议是编写FindProxyForURL
这样的代码,它不需要知道主机的 IP 地址(或者让服务 PAC 脚本的服务器通过服务器端脚本将客户端的 IP 地址嵌入到脚本中)。
如果你的很大一部分用户运行的浏览器支持微软的扩大您还可以添加一个FindProxyForURLEx
函数,利用myIPAddressEx
也不建议dnsResolve
在 PAC 脚本中使用,因为在进行 DNS 解析时可能会阻止浏览器。