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


11

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 honra 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 la página API de Font Loader :

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

Podría obtener una mejor respuesta reformulando su pregunta para preguntar sobre el problema técnico en lugar de por qué Google está haciendo algo. No obtendrá una respuesta real a la segunda (a menos que veamos otra respuesta de Google aquí, lo que sería genial).
JasonBirch

Ligera edición en un intento de hacerlo más agnóstico. ¿Cualquier otra sugerencia?
Metalshark el

Respuestas:


3

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

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

2011.01.23: Pero ... ¿qué pasa con el uso de 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 de GA si no le importa IE6 ... de lo contrario, necesitará ese operador ternario. `:)`
2011.12.24. Eric Law (del equipo de 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 .


1

Ya señaló la diferencia en el caso de Google Analytics, es decir, que la versión segura está https://ssl.activada 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.


Otro ejemplo sería el cargador de fuentes code.google.com/apis/webfonts/docs/webfont_loader.html aquí no hay diferencia en el dominio. Cada ejemplo repetitivo de su código sigue el mismo patrón.
Metalshark

En ese caso, están usando el mismo dominio. ¿Quizás hay algunos navegadores arcaicos que no reconocen el //protocolo?
DisgruntledGoat

Ese era el pensamiento, pero ¿cuáles, más importante, cuáles también admiten la fuente web? ¿Permite un comportamiento más paralelo (estilo de física cuántica, al leer el protocolo altera el estado del navegador)? Lo he probado a fondo y aún no veo la lógica ...
Metalshark 05 de

0

Esta respuesta de desbordamiento de pila 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 utiliza "magia iframe" ( about:).


0

//www.google-analytics.com/ga.jsno es una URL según 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 ("//").


El esquema no es obligatorio donde es el mismo en los navegadores.
Metalshark

Lea el RFC por favor: el esquema es obligatorio en todas las URL. Esto es independiente de lo que sucede con el trabajo, el estándar simplemente dice lo contrario y hay desviaciones en la naturaleza.
Patrick Mevzek
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.