URI que comienza con dos barras ... ¿cómo se comportan?

92

Últimamente vi bloques de código funcionando como este:

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

Y de acuerdo con RFC 2396 (Sintaxis URI) y RFC 2616 (HTTP 1.1), estas URI que comienzan con dos barras son válidas, pero desafortunadamente las RFC no las explican realmente.

¿Alguien puede señalarme un recurso que explique cómo los navegadores procesarán / deberían / ​​deberían procesar estos URI?

pagid
fuente

Respuestas:

86

El recurso que está buscando es el RFC 3986 .

Consulte la Sección 4.2 y la Sección 5.4. Citando de este último:

Ejemplos de resolución de referencia

Dentro de una representación con un URI base bien definido de:

    http://a/b/c/d;p?q

una referencia relativa se transforma en su URI de destino de la siguiente manera:

  "g:h"           =  "g:h"
  "g"             =  "http://a/b/c/g"
  "./g"           =  "http://a/b/c/g"
  "g/"            =  "http://a/b/c/g/"
  "/g"            =  "http://a/g"
  "//g"           =  "http://g"
  "?y"            =  "http://a/b/c/d;p?y"
  "g?y"           =  "http://a/b/c/g?y"
  "#s"            =  "http://a/b/c/d;p?q#s"
  "g#s"           =  "http://a/b/c/g#s"
  "g?y#s"         =  "http://a/b/c/g?y#s"
  ";x"            =  "http://a/b/c/;x"
  "g;x"           =  "http://a/b/c/g;x"
  "g;x?y#s"       =  "http://a/b/c/g;x?y#s"
  ""              =  "http://a/b/c/d;p?q"
  "."             =  "http://a/b/c/"
  "./"            =  "http://a/b/c/"
  ".."            =  "http://a/b/"
  "../"           =  "http://a/b/"
  "../g"          =  "http://a/b/g"
  "../.."         =  "http://a/"
  "../../"        =  "http://a/"
  "../../g"       =  "http://a/g"

Esto significa que cuando el URI base es http://a/b/c/d;p?qy lo usa //g, la referencia relativa se transforma en http://g.

Daniel Vassallo
fuente
4
Entonces, ¿puede ser esta una solución para usar javascript para determinar http o https de esta manera, sea lo que sea, funcionará?
Ibu
Dado que necesita alcanzar el nivel de padre, use ../g: usará el protocolo actual y conducirá a http://a/b/c/g.
Boris S
Puede ser una pregunta para principiantes, pero ¿de dónde proviene este URI base? la barra de URL del navegador? ¿el servidor? una etiqueta en la página html?
coderatchet
1
@thenaglecode: la respuesta es, depende. En XML / XHTML / HTML5 puede usarlo xml:basepara configurarlo explícitamente en cualquier elemento . Por defecto en HTML, el URI base es el mismo URI de la página (pero dentro de un archivo CSS, el URI base es relativo al uri CSS, no al HTML que lo contiene , pero el IE más antiguo lo hizo relativo al HTML). En otros protocolos y lenguajes, puede ser diferente (en XSLT, depende del elemento actual, por ejemplo). Vea también <html:base>.
Abel
1
Importante: ¡el resultado no es siempre http! Depende del protocolo del contexto de la página. Si el contexto se cargó bajo http://a/b/c/d;p?q, entonces de //ghecho se resuelve en http://g. Pero si la página se cargó como http://a/b/c/d;p?q, el resultado será https://g. Y tampoco te olvides de otros protocolos como file://(la página se carga desde el disco), lo que definitivamente te dará muchos dolores de cabeza.
Andrey Tserkus
62

Estas son URL relativas al protocolo. Señalan una dirección, manteniendo el protocolo actual.

Esta notación se utiliza a menudo para evitar el problema de "contenido mixto" (un mensaje de advertencia IE quejándose httpy httpsrecursos en la misma página HTTPS).

Actualización: documentación oficial en RFC 3986:

Una referencia relativa que comienza con dos caracteres de barra se denomina referencia de ruta de red; estas referencias rara vez se utilizan. Una referencia relativa que comienza con un solo carácter de barra se denomina referencia de ruta absoluta. Una referencia relativa que no comienza con un carácter de barra se denomina referencia de ruta relativa.

Pekka
fuente
Es bueno saberlo, pero cuán compatible es esto con los navegadores populares. Una búsqueda rápida me dijo que no funciona con IE6 ... ¿es esta una característica de HTML5?
Shane N
4
@Shane esto debería funcionar en todos los navegadores. ¿Tiene un enlace que dice que no funciona en IE6?
Pekka
4
¡Estoy bastante seguro de que es una característica de IE1!
Jon Hanna
más por mencionar el protocolo relativo
Tawfik Khalifeh
1

Tenga en cuenta que no solo es independiente de http o https , sino también de archivos , ftp , etc.

Significa que si abre el archivo .htm directamente en su navegador en localhost, el navegador se resolverá // como protocolo de archivo y su página no funcionará. Puede causar problemas en sitios web empaquetados como aplicaciones "nativas" que utilizan herramientas como Electron, PhoneGap, etc.

Ejemplo:

<script src="//mywebsite.com/resource.js"></script>

a

<script src="file://mywebsite.com/resource.js"></script>
lukyer
fuente