Google Analytics统计代码出现JavaScript没有权限错误

转载自:http://www.zhujun.org/web/google-analytics-javascript-permission-denied/

近日,当我访问本博客时经常出现一个JavaScript没有权限的错误,如下图所示:
javascript 没有权限 错误

经过一些排查,发现这个JS没有权限的错误有如下特点:

  1. 打开网页时该错误只出现一次,似乎和缓存有关,网页刷新后消失。
  2. 在我的几个其它网站也会出现,出错位置均在Google Analytics统计代码附近。
  3. 仅在IE6下出现(IE7、IE8未测试),用Firefox和Chrome打开出错页面都没有错误提示。

尝试解决如下:

  • 清空IE6缓存、Cookies并打开出错页面,发现错误消失,大喜。重新再开,错误又现!
  • 登录Google Analytics后台,检查代码,没有问题。
  • 去掉 【IE6 – 工具 – Internet选项 – 高级 – 禁用脚本调试(Internet Explorer)】菜单项的勾选,调试该网页,发现错误出现在如下代码:var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    观察变量发现document.location对象不可读取。

原来问题出在document.location对象上,用Google进行一些搜索,发现location对象仅在iframe和ajax跨域访问的时候,才会由于安全问题而变得不可读,但我的网页既没有用ajax,也没有用iframe,难道被人挂马了?
查看源代码,却没有发现任何问题。而我无论用什么关键字搜索,都找不到为什么不跨域访问的时候,也会出现location对象不可读取,导致JavaScript报“没有权限”的错误,至此问题陷入死胡同。

变通的解决方法:

虽然将:var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
改成:var gaJsHost = "http://www." ;可以避免该错误出现,但是这样就会失去了对https协议的统计,另外我也很想知道到底是什么原因造成了location对象的不可读。

柳暗花明又一村:

由于我还有一台同样是Xp sp2/IE6的电脑,于是拿来测试出错网页,结果在该台电脑上一切正常。
一定是IE的设置问题!
于是用出错的电脑照搬了正常电脑IE6 Internet选项中“安全、隐私、内容、高级”的全部设置,结果却大失所望,出错的电脑,打开网页时,依然会报没有权限的JavaScript错误。

正当我准备放弃的时候,发现两台电脑的Internet选项 – 连接 – 局域网设置不一样,出错电脑勾选了“使用自动配置脚本”,参数如下:file://e:\list.pac。去掉对该项的勾选,打开出错网站,JavaScript“没有权限”的错误消失!

关于pac文件的额外知识:

热爱技术和自由的朋友一定知道SSH在国内网络环境下有其它的大用处,不过一旦配置了SSH的代理,则访问所有网页都需要通过该代理,影响速度、浪费带宽。
配置pac文件作为脚本,可以指定访问特定网页时才走代理,否则就直接连接,完美解决上述SSH的缺陷。
示例如下:
function FindProxyForURL( url, host )
{
if ( shExpMatch(url, "*free-site.org*")
|| shExpMatch(url, "*.hecaitou.*")
......
|| shExpMatch(url, "*.another-free-site.com*")
)
return "SOCKS 127.0.0.1:7070";
else
return "DIRECT";
}

用文本编辑器创建list.pac,复制上述代码,将……替换成如下形式(可以新增多行):
|| shExpMatch(url, "*任意平时不能访问的网址*")
保存至本地硬盘,然后在 工具 – Internet选项 – 连接 – 局域网设置 – 使用自动配置脚本,填入file://pac文件地址,如:file://c:\list.pac 即可(须注意/和\,不能写错)。

结论:

言归正传,终于知道了IE6为什么会报JavaScript没有权限的错误了,既不是iframe跨域访问,也不是ajax跨域访问,而是IE6对pac脚本的处理出现了Bug,可能使用pac后,IE认为访问所有网站都是跨域的,于是把location对象设成了不可读。
那为什么刷新出错网页以后没有权限的错误就消失了呢?也许只有比尔.盖茨才知道了。

由于我本没有必要使用SSH和PAC文件,浪费如此多的时间排查错误,全拜为我服务的仆人们所赐,此时此刻,唯有天朝神兽能够代表我的心情: :mad: :mad: :mad: 

posted @ 2012-03-02 02:16  神龙升空  阅读(573)  评论(0编辑  收藏  举报