Warum sollten Sie document.location.protocol anstelle von einfachen URLs mit // Präfix verwenden?

11

Zum Beispiel verwendet Google Analytics document.location.protocol im Boilerplate zur Verfolgung:

<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>

Anstatt von

<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>

Die ssl. Subdomain ist ein stummes Argument, da https://www.google-analytics.com/ga.js einwandfrei funktioniert.

Google zu kennen, ist höchstwahrscheinlich kein Versehen. Gibt es ein Problem mit bestimmten Browsern, die das // Protokoll zur Unterstützung der Kurzform nicht unterstützen, oder fehlt mir noch etwas?

BEARBEITEN: Dies gilt nicht nur für Google Analytics (anderes Subdomain-Beispiel). Dasselbe wird auf der Font Loader-API-Seite angezeigt :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
Metallhai
quelle
Möglicherweise erhalten Sie eine bessere Antwort, wenn Sie Ihre Frage neu formulieren, um Fragen zum technischen Problem zu stellen, anstatt zu erklären, warum Google etwas unternimmt. Sie werden keine echte Antwort auf die zweite bekommen (es sei denn, wir sehen hier eine andere Googler-Antwort, die cool wäre).
JasonBirch
Leichte Bearbeitung, um es agnostischer zu machen. Irgendwelche anderen Vorschläge?
Metalshark

Antworten:

3

In der Tat war es kein Versehen des GA-Teams!
Der GA-Loader lädt ein Skript, sodass der Fehler beim doppelten Herunterladen auf einem <link>oder @importfür Stylesheets in IE7 / IE8 nicht betroffen ist .

Sie verwenden den bedingten (ternären) Operator document.location.protocol aufgrund eines Edge-Case-Fehlers in IE6, der dazu führt, dass unter bestimmten Sicherheitseinstellungen ein Sicherheitsdialog angezeigt wird, wenn eine Anforderung von der Nicht-SSL-Subdomain angefordert wird , wie von Paul Irish (der gearbeitet hat) erläutert zusammen mit dem Javascript-Hauptentwickler von Google Analytics in dieser Angelegenheit) in seinem Blog: https://www.paulirish.com/2010/the-protocol-relative-url/, aus dem ich unten zitiere:
IE6-Sicherheits-Sicherheitsdialogbild, Quelle: http://paulirish.com/i/7b01.png

23.01.2011: Aber ... was ist mit der Verwendung im Google Analytics-Snippet ?
Ja, natürlich, wäre das nicht schön ... Also habe ich mit dem führenden JavaScript-Entwickler von Google Analytics (Gott, ich liebe es, bei Google zu arbeiten) zusammengearbeitet, um zu sehen, ob wir das schaffen könnten ... es stellt sich heraus, dass wir das nicht können. In IE6 gibt es einen Edgecase-Fehler, der dazu führt, dass ein Dialogfeld in die Luft sprengt ... unter einigen Sicherheitseinstellungen (nicht sicher, ob sie Standard sind), wenn eine Anforderung von der Nicht-SLS-Subdomain angefordert wird. Screenshot hier . Nehmen Sie also 40 Bytes von Ihrem GA-Snippet, wenn Sie sich nicht für IE6 interessieren. Andernfalls benötigen Sie diesen ternären Operator. `:)`
2011.12.24. Eric Law (vom IE-Team) erklärt, warum IE6 nicht gut spielt GA ...
Der Grund, warum dies in IE6 nicht funktioniert, ist, dass der Server SNI verwendet, um abzuleiten, welches Zertifikat zurückgegeben werden soll. XP (und damit IE6) unterstützt SNI im HTTPS-Stack nicht . Siehe für Details .
GitaarLAB
quelle
1

Sie haben bereits den Unterschied im Fall von Google Analytics nämlich darauf hingewiesen, dass die sichere Version ist auf https://ssl.statt http://www.. Während eine sichere Version des WWW möglicherweise funktioniert, kann sie sich auch von der SSL-Version unterscheiden:

  • Verschiedene Zertifikate für die SSL-Version und die WWW-Version.
  • Unterschiedlicher Code für jede Version.
  • Verschiedene Cookies gesetzt, spezifisch für die SSL-Domain.

Ich weiß jedoch nicht, ob dies für Google gilt. Auf den ersten Blick schien der Code der gleiche zu sein.

DisgruntledGoat
quelle
Ein weiteres Beispiel wäre der Font Loader code.google.com/apis/webfonts/docs/webfont_loader.html. Hier gibt es keinen Unterschied in der Domain. Jedes Boilerplate-Beispiel ihres Codes folgt demselben Muster.
Metalshark
In diesem Fall verwenden sie dieselbe Domain. Vielleicht gibt es einige archaische Browser, die das //Protokoll nicht erkennen ?
DisgruntledGoat
Das war der Gedanke, aber welche, was noch wichtiger ist, welche unterstützen auch Webfonts? Ermöglicht es mehr paralleles Verhalten (quantenphysikalischer Stil, durch Lesen des Protos ändert sich der Zustand des Browsers)? Ich habe gründlich getestet und muss noch die Logik sehen ...
Metalshark
0

Diese Stapelüberlauf- Antwort macht einige gute Punkte.

Es wäre wichtig, das Protokoll explizit anzugeben, damit das Ziel-Asset korrekt in ein Dokument geladen wird, das von einem lokalen Laufwerk ( file:) oder bei Verwendung von "iframe magic" ( about:) geöffnet wurde .

Andrew Ashbacher
quelle
0

//www.google-analytics.com/ga.jsist keine URL gemäß ihrem Standard, da ihm das obligatorische Schema fehlt. Es funktioniert und wird verwendet, entspricht jedoch nicht dem URL-Standard.

Siehe RFC3986 §3:

Die Schema- und Pfadkomponenten sind erforderlich, obwohl der Pfad möglicherweise leer ist (keine Zeichen). Wenn Autorität vorhanden ist, muss der Pfad entweder leer sein oder mit einem Schrägstrich ("/") beginnen. Wenn keine Berechtigung vorhanden ist, kann der Pfad nicht mit zwei Schrägstrichen ("//") beginnen.

Patrick Mevzek
quelle
Das Schema ist nicht erforderlich, wenn es in Browsern identisch ist.
Metalshark
Lesen Sie bitte den RFC: Das Schema ist in allen URLs obligatorisch. Dies ist unabhängig davon, was mit der Arbeit passiert. Der Standard sagt nur etwas anderes und es gibt Abweichungen in freier Wildbahn.
Patrick Mevzek