web-dev-qa-db-fra.com

Pourquoi voudriez-vous utiliser document.location.protocol au lieu d’URL // préfixées simples?

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 tel que https://www.google-analytics.com/ga.js fonctionne parfaitement bien.

Connaître Google comme étant le plus probable n’est pas un oubli. Y at-il un problème avec certains navigateurs qui ne prennent pas en charge le protocole // en respectant l’abréviation, ou y at-il autre chose qui me manque?

EDIT: Ceci ne s'applique pas uniquement à 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';
11
Metalshark

En effet, ce n'était pas un oubli de la part de l'équipe GA!
GA loader charge un script, ce qui n’affecte pas le bogue de double téléchargement sur un <link> ou @import pour une feuille de style dans IE7/IE8.

Ils utilisent l'opérateur conditionnel (ternaire) sur document.location.protocol en raison d'un bogue Edge-case dans IE6 qui fait apparaître une boîte de dialogue de sécurité avec certains paramètres de sécurité -ssl 'sous-domaine ,
IE6 security security-dialog image, source: http://paulirish.com/i/7b01.png
, comme l'explique Paul Irish (qui a collaboré avec le développeur principal de Google Analytics sur ce sujet) sur son blog: https://www.paulirish.com/2010/the-protocol-relative -url / dont je cite ci-dessous:

2011.01.23: Mais ... qu'en est-il de en utilisant ceci dans l'extrait de Google Analytics ?
Oui, bien sûr, cela ne serait-il pas agréable ... J'ai donc travaillé avec le développeur principal de Google Analytics en javascript (Dieu adore travailler chez Google) pour voir si nous pouvions le faire ... mais nous ne le 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é (indiquez s'ils sont par défaut) lors de la demande auprès du sous-domaine non "assl". capture d'écran ici . Alors n'hésitez pas à prendre 40 octets de votre GA snippet si vous ne vous souciez pas de 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 en général ...
Cela ne fonctionne pas dans IE6 parce que le serveur utilise SNI pour en déduire le certificat à renvoyer. XP (et donc IE6) ne supporte pas SNI dans la pile HTTPS. Voir les détails .
3
GitaarLAB

Il y a au moins un problème dans IE, car il entraîne un double téléchargement: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download /

4
AlfonsoML

Vous avez déjà souligné la différence dans le cas de Google Analytics, à savoir que la version sécurisée est sur https://ssl. au lieu de http://www.. Bien qu'une version sécurisée du site www puisse fonctionner, elle pourrait é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 types de cookies, spécifiques au domaine SSL.

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

1
DisgruntledGoat

//www.google-analytics.com/ga.js n'est pas une URL au sens standard, car il manque le schéma, qui est obligatoire. Cela fonctionne et est utilisé, mais il reste non conforme à la norme URL.

Voir RFC3986 §3:

Les composants schéma et chemin sont obligatoires, 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 ("/"). En l'absence d'autorité, le chemin ne peut pas commencer par deux barres obliques ("//").

0
Patrick Mevzek

Ce débordement de pile réponse apporte de bons arguments.

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