为什么要使用document.location.protocol代替纯//前缀的url?


12

例如,Google Analytics(分析)在样板中使用document.location.protocol进行跟踪:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

代替

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = '//www.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

SSL。子域是一个静音参数,因为https://www.google-analytics.com/ga.js可以很好地运行。

知道谷歌这很有可能不是疏忽。某些浏览器是否不支持//遵循协议速记的问题,还是我还缺少其他东西?

编辑:这不仅适用于Google Analytics(分析)(不同的子域示例)。在Font Loader API页面上会出现相同的内容:

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';

改写您的问题可能会得到更好的答复,询问有关技术问题的信息,而不是Google为什么要这样做的原因。您不会对第二个问题有真正的答案(除非我们在这里看到另一个Googler的回复,这很酷)。
JasonBirch 2010年

进行轻微编辑以使其更加不可知。还有其他建议吗?
Metalshark

Answers:


3

实际上,这不是 GA团队的监督
GA加载程序会加载脚本,因此不会受到IE7 / IE8中<link>@import样式表的重复下载错误的影响。

他们之所以使用条件(三元)运算符,document.location.protocol 是因为IE6中的一个边缘案例错误,当从non-'ssl'子域请求时,会导致在某些安全设置下弹出安全对话框, 如Paul Irish(以及Google Analytics(分析)javascript首席开发人员对此事)在他的博客上:https//www.paulirish.com/2010/the-protocol-relative-url/,下面引用:
IE6安全性安全性对话图像,来源:http://paulirish.com/i/7b01.png

2011.01.23:但是... 在Google Analytics(分析)代码段中使用该代码又如何呢?
是的,当然,那不是很好。。。所以我与Google Analytics(分析)javascript首席开发人员(上帝,我喜欢在google工作)一起工作,看看是否可以做到这一点……事实证明我们做不到。在IE6中有一个严重的错误,当从非'ssl'子域请求时,在某些安全设置(不确定它们是否为默认设置)下,会导致对话框爆炸。屏幕截图在这里。因此,如果您不在乎IE6,请随意从您的GA代码段中删除40个字节。否则,您将需要该三元运算符。`:)`
2011.12.24。埃里克·劳(来自IE团队)对为什么IE6不能很好地发挥GA感到很高兴。
这在IE6中不起作用的原因是服务器正在使用SNI推断要返回的证书。XP(因此IE6)在HTTPS堆栈中不支持SNI有关详细信息,请参见


1

您已经指出了Google Analytics(分析)的区别,即安全版本为,https://ssl.而不是http://www.。尽管www的安全版本可能有效,但它也可能与ssl版本不同:

  • ssl版本和www版本的不同证书。
  • 每个版本上都有不同的代码。
  • 特定于SSL域的不同cookie集。

我不知道其中任何一个是否适用于Google。乍一看,代码看起来是一样的。


另一个示例是字体加载器code.google.com/apis/webfonts/docs/webfont_loader.html,此处域没有区别。他们的代码的每个样板示例都遵循相同的模式。
Metalshark,2010年

在这种情况下,他们使用的是同一域。也许有些古老的浏览器无法识别该//协议?
DisgruntledGoat 2010年

那就是想法,但是更重要的是,哪些还支持Web字体?它是否允许更多并行行为(量子物理学风格,通过阅读原始信息会改变浏览器的状态)?我已经过全面测试,但还没有看到逻辑……
Metalshark


0

//www.google-analytics.com/ga.js不是按照其标准的URL,因为它缺少强制性的方案。它可以使用并且可以使用,但是仍然不符合URL标准。

参见RFC3986§3:

尽管路径可能为空(无字符),但方案和路径组件是必需的。如果存在权限,则路径必须为空或以斜杠(“ /”)开头。如果没有权限,则路径不能以两个斜杠字符(“ //”)开头。


如果在浏览器中相同,则不需要该方案。
Metalshark

请阅读RFC:该方案在所有URL中都是必需的。这与发生的事情无关,标准只是说相反,而且存在偏差。
Patrick Mevzek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.