it-swarm-es.com

¿Por qué usaría document.location.protocol en lugar de URL // prefijadas simples?

Por ejemplo, Google Analytics utiliza document.location.protocol en la plantilla para el seguimiento:

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

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

El ssl. El subdominio es un argumento mudo ya que https://www.google-analytics.com/ga.js funciona perfectamente bien.

Conocer Google probablemente no es un descuido. ¿Hay algún problema con ciertos navegadores que no admiten el // protocolo que respeta la taquigrafía o hay algo más que me falta?

EDITAR: Esto no solo se aplica a Google Analytics (ejemplo de subdominio diferente). Lo mismo aparece en el página API de Font Loader :

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

De hecho, ¡fue no un descuido por parte del Equipo GA!
El cargador GA carga un script, por lo que no se ve afectado por el error de doble descarga en un <link> o @import para hojas de estilo en IE7/IE8.

Utilizan el operador condicional (ternario) en document.location.protocol debido a un error de Edge-case en IE6 que hace que aparezca un diálogo de seguridad bajo ciertas configuraciones de seguridad cuando se solicita -ssl 'subdominio ,
IE6 security security-dialog image, source: http://paulirish.com/i/7b01.png
como lo explicó Paul Irish (quien trabajó junto con el desarrollador principal de JavaScript de Google Analytics en este asunto) en su blog: https://www.paulirish.com/2010/the-protocol-relative -url / del cual cito a continuación:

2011.01.23: Pero ... ¿qué pasa con sando esto en el fragmento de Google Analytics ?
Sí, por supuesto, no sería bueno ... Así que trabajé con el desarrollador principal de JavaScript de Google Analytics (Dios, me encanta trabajar en Google) para ver si podíamos hacer esto ... resulta que no podemos. Hay un error de edgecase en IE6 que hace que explote un cuadro de diálogo ... en algunas configuraciones de seguridad (no estoy seguro si son predeterminadas) cuando se solicita desde el subdominio no'ssl '. captura de pantalla aquí . Así que siéntase libre de quitar 40 bytes de su fragmento GA si no le importa IE6 ... de lo contrario, necesitará ese operador ternario. `:)`
2011.12.24. Eric Law (del equipo IE) comenta por qué IE6 no juega bien GA ...
La razón por la que esto no funciona en IE6 es que el servidor está usando SNI para deducir qué certificado devolver. XP (y, por lo tanto, IE6) no admite SNI en la pila HTTPS. Ver para más detalles .
3
GitaarLAB

Al menos tiene un problema en IE porque causa descargas dobles: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download /

4
AlfonsoML

Ya señaló la diferencia en el caso de Google Analytics, a saber, que la versión segura está en https://ssl. en lugar de http://www.. Si bien una versión segura de www puede funcionar, también podría ser diferente a la versión SSL:

  • Distintos certificados para la versión SSL y la versión www.
  • Código diferente en cada versión.
  • Diferentes cookies establecidas, específicas para el dominio SSL.

Sin embargo, no sé si alguno de estos se aplica a Google. De un vistazo, el código parecía ser el mismo.

1
DisgruntledGoat

//www.google-analytics.com/ga.js no es una URL por su estándar, ya que carece del esquema, que es obligatorio. Funciona y se usa, pero sigue sin cumplir con el estándar URL.

Ver RFC3986 §3:

El esquema y los componentes de la ruta son obligatorios, aunque la ruta puede estar vacía (sin caracteres). Cuando la autoridad está presente, la ruta debe estar vacía o comenzar con un carácter de barra diagonal ("/"). Cuando la autoridad no está presente, la ruta no puede comenzar con dos caracteres de barra diagonal ("//").

0
Patrick Mevzek

Este desbordamiento de pila respuesta hace algunos buenos puntos.

Sería importante especificar explícitamente el protocolo para que el activo de destino se cargue correctamente dentro de un documento abierto desde una unidad local (file:) o cuando se usa "iframe magic" (about:).

0
Andrew Ashbacher