Pourquoi utiliseriez-vous document.location.protocol à la place des URL // simples préfixées?


11

Par exemple, Google Analytics utilise document.location.protocol dans le passe-partout pour le suivi:

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

au lieu de

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

Le ssl. le sous-domaine est un argument muet car https://www.google-analytics.com/ga.js fonctionne parfaitement bien.

Connaître Google n'est probablement pas une erreur. Y a-t-il un problème avec certains navigateurs qui ne prennent pas en charge le protocole // honorant la sténographie ou y a-t-il autre chose qui me manque?

EDIT: Cela ne s'applique pas seulement à Google Analytics (exemple de sous-domaine différent). La même chose apparaît sur la page de l'API Font Loader :

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

Pourrait obtenir une meilleure réponse reformulant votre question pour poser des questions sur le problème technique plutôt que sur la raison pour laquelle Google fait quelque chose. Vous n'obtiendrez pas une vraie réponse à la seconde (à moins que nous ne voyions une autre réponse de Googler ici, ce qui serait cool).
JasonBirch

Légère modification dans le but de la rendre plus agnostique. D'autres suggestions?
Metalshark

Réponses:


3

En effet, ce n'était pas un oubli par l'équipe GA!
GA Loader charge un script, ce qui n'est pas affecté par le bogue de double téléchargement sur une <link>ou @importpour une feuille de style dans IE7 / IE8.

Ils utilisent l'opérateur conditionnel (ternaire) en document.location.protocol raison d'un bogue de casse de bord dans IE6 qui fait apparaître une boîte de dialogue de sécurité sous certains paramètres de sécurité lors de la demande du sous-domaine non-'ssl ' , comme expliqué par Paul Irish (qui a travaillé avec le développeur principal de Google Analytics javascript sur cette question) sur son blog: https://www.paulirish.com/2010/the-protocol-relative-url/ dont je cite ci-dessous:
Image de dialogue de sécurité de sécurité IE6, source: http://paulirish.com/i/7b01.png

2011.01.23: Mais ... qu'en est-il de l' utilisation de cet extrait de code Google Analytics ?
Oui bien sûr, ce ne serait pas bien ... Alors j'ai travaillé avec le développeur principal de javascript Google Analytics (Dieu, j'adore travailler chez google) pour voir si nous pouvions le faire ... il s'avère que nous ne pouvons pas. Il y a un bogue edgecase dans IE6 qui fait exploser une boîte de dialogue ... sous certains paramètres de sécurité (je ne sais pas s'ils sont par défaut) lors d'une demande depuis le sous-domaine non'ssl '. capture d'écran ici . Alors n'hésitez pas à retirer 40 octets de votre extrait GA si vous ne vous souciez pas d'IE6 .. sinon vous aurez besoin de cet opérateur ternaire. `:)`
2011.12.24. Eric Law (de l'équipe IE) explique pourquoi IE6 ne joue pas bien GA ...
La raison pour laquelle cela ne fonctionne pas dans IE6 est que le serveur utilise SNI pour déduire le certificat à renvoyer. XP (et donc IE6) ne prend pas en charge SNI dans la pile HTTPS . Voir pour plus de détails .


1

Vous avez déjà souligné la différence dans le cas de Google Analytics, à savoir que la version sécurisée est https://ssl.activée au lieu de http://www.. Bien qu'une version sécurisée du www puisse fonctionner, elle peut également être différente de la version ssl:

  • Différents certificats pour la version ssl et la version www.
  • Code différent sur chaque version.
  • Différents cookies, spécifiques au domaine SSL.

Je ne sais pas si l'un d'eux s'applique à Google. D'un coup d'œil, le code semblait être le même.


Un autre exemple serait le chargeur de polices code.google.com/apis/webfonts/docs/webfont_loader.html ici, il n'y a pas de différence de domaine. Chaque exemple standard de leur code suit le même modèle.
Metalshark

Dans ce cas, ils utilisent le même domaine. Peut-être qu'il existe des navigateurs archaïques qui ne reconnaissent pas le //protocole?
DisgruntledGoat

C'était la pensée, mais lesquels, plus important encore, ceux qui prennent également en charge les polices Web? Permet-il un comportement plus parallèle (style de physique quantique, en lisant le proto il modifie l'état du navigateur)? J'ai minutieusement testé et je n'ai pas encore vu la logique ...
Metalshark

0

Cette réponse Stack Overflow fait de bons points.

Il serait important de spécifier explicitement le protocole afin que l'actif cible soit chargé correctement dans un document ouvert à partir d'un lecteur local ( file:) ou lors de l'utilisation de "iframe magic" ( about:).


0

//www.google-analytics.com/ga.jsn'est pas une URL selon sa norme, car il lui manque le schéma, qui est obligatoire. Il fonctionne et est utilisé, mais il reste non conforme à la norme URL.

Voir RFC3986 §3:

Les composants du schéma et du chemin sont requis, bien que le chemin puisse être vide (pas de caractères). Lorsque l'autorité est présente, le chemin doit être vide ou commencer par une barre oblique ("/"). Lorsque l'autorité n'est pas présente, le chemin ne peut pas commencer par deux barres obliques ("//").


Le schéma n'est pas requis lorsqu'il est le même dans les navigateurs.
Metalshark

Veuillez lire la RFC: le schéma est obligatoire dans toutes les URL. C'est indépendamment de ce qui arrive au travail, la norme dit simplement le contraire et il y a des écarts dans la nature.
Patrick Mevzek
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.