Perché dovresti usare document.location.protocol invece di semplici URL // con prefisso?


11

Ad esempio, Google Analytics utilizza document.location.protocol nella caldaia per tracciare:

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

invece di

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

La ssl. sottodominio è un argomento muto in quanto https://www.google-analytics.com/ga.js funziona perfettamente.

Conoscere Google molto probabilmente non è una svista. C'è un problema con alcuni browser che non supportano il protocollo // che onora la stenografia o c'è qualcos'altro che mi manca?

EDIT: questo non si applica solo a Google Analytics (diverso esempio di sottodominio). La stessa cosa appare sulla pagina API Caricatore font :

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

Potrebbe ottenere una risposta migliore riformulando la tua domanda per porre il problema tecnico piuttosto che il motivo per cui Google sta facendo qualcosa. Non otterrai una risposta reale alla seconda (a meno che non vediamo un'altra risposta su Google, che sarebbe interessante).
JasonBirch il

Leggera modifica nel tentativo di renderla più agnostica. Altri suggerimenti?
Metalshark,

Risposte:


3

In effetti, non è stata una svista da parte del GA Team!
Il caricatore GA carica uno script, quindi non è interessato dal bug di doppio download su un <link>o @importper fogli di stile in IE7 / IE8.

Usano l'operatore condizionale (ternario) a document.location.protocol causa di un bug edge-case in IE6 che fa apparire una finestra di dialogo di sicurezza in determinate impostazioni di sicurezza quando richiesto dal sottodominio non'ssl ' , come spiegato da Paul Irish (che ha lavorato insieme allo sviluppatore principale javascript di Google Analytics su questo argomento) sul suo blog: https://www.paulirish.com/2010/the-protocol-relative-url/ da cui cito di seguito:
Immagine del dialogo di sicurezza di sicurezza IE6, fonte: http://paulirish.com/i/7b01.png

23.01.2011: Ma ... che ne dici di usarlo sullo snippet di Google Analytics ?
Sì, certo, non sarebbe carino ... Quindi ho lavorato con lo sviluppatore di lead javascript di Google Analytics (Dio, adoro lavorare con Google) per vedere se potevamo farlo ... risulta che non possiamo. Esiste un bug edgecase in IE6 che provoca l'esplosione di una finestra di dialogo ... con alcune impostazioni di sicurezza (non sono sicure se sono predefinite) quando si richiede dal sottodominio non'ssl '. screenshot qui . Quindi, sentiti libero di togliere 40 byte dal tuo frammento di GA se non ti interessa IE6 .. altrimenti avrai bisogno di quell'operatore ternario. `:)`
2011/12/24. Eric Law (dal team di IE) parla del perché IE6 non gioca bene GA ...
Il motivo per cui non funziona in IE6 è che il server utilizza SNI per dedurre quale certificato restituire. XP (e quindi IE6) non supporta SNI nello stack HTTPS . Vedi per i dettagli .


1

Hai già sottolineato la differenza nel caso di Google Analytics, vale a dire che la versione protetta è attiva https://ssl.anziché http://www.. Mentre una versione sicura di www può funzionare, potrebbe anche essere diversa dalla versione ssl:

  • Certificati diversi per la versione ssl e la versione www.
  • Codice diverso su ogni versione.
  • Diversi cookie impostati, specifici per il dominio SSL.

Non so se qualcuno di questi si applica a Google però. Da un colpo d'occhio il codice sembrava essere lo stesso.


Un altro esempio potrebbe essere il caricatore di font code.google.com/apis/webfonts/docs/webfont_loader.html qui non c'è differenza nel dominio. Ogni esempio di codice del loro codice segue un modello identico.
Metalshark,

In tal caso, stanno usando lo stesso dominio. Forse ci sono alcuni browser arcaici che non riconoscono il //protocollo?
DisgruntledGoat

Quello era il pensiero, ma quali, cosa ancora più importante quali supportano anche il font web? Permette un comportamento più parallelo (stile di fisica quantistica, leggendo il proto altera lo stato del browser)? Ho testato a fondo e devo ancora vedere la logica ...
Metalshark,

0

Questa risposta Stack Overflow fa alcuni punti positivi.

Sarebbe importante specificare esplicitamente il protocollo in modo che l'asset di destinazione venga caricato correttamente all'interno di un documento aperto da un'unità locale ( file:) o quando si utilizza "iframe magic" ( about:).


0

//www.google-analytics.com/ga.jsnon è un URL per il suo standard, in quanto manca lo schema, che è obbligatorio. Funziona e viene utilizzato, ma rimane non conforme allo standard URL.

Vedi RFC3986 §3:

Sono richiesti i componenti dello schema e del percorso, sebbene il percorso possa essere vuoto (nessun carattere). Quando è presente l'autorità, il percorso deve essere vuoto o iniziare con un carattere barra ("/"). Quando l'autorità non è presente, il percorso non può iniziare con due caratteri di barra ("//").


Lo schema non è richiesto dove è lo stesso nei browser.
Metalshark,

Leggi la RFC per favore: lo schema è obbligatorio in tutti gli URL. Questo è indipendentemente da ciò che accade, lo standard dice semplicemente il contrario e ci sono deviazioni in natura.
Patrick Mevzek, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.