2010-11-01 10 views
82

Últimamente vi trabajo código de bloques de la siguiente manera:URI comenzando con dos barras ... ¿cómo se comportan?

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

Y de acuerdo con RFC 2396 (URI Sintaxis) y RFC 2616 (HTTP 1.1), estos URI que comienzan con dos barras son válidas, pero desafortunadamente el RFC realmente no los explico

¿Alguien me puede indicar un recurso que explica cómo los navegadores/deberían/​​procesarán estos URI?

Respuesta

84

El recurso que está buscando es el RFC 3986.

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

Referencia Resolución Ejemplos

Dentro de una representación con una base bien definida URI de:

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

una referencia relativa se transforma a su diana URI 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?q y usa //g, la referencia relativa se transforma en http://g.

+4

así que puede ser una solución al uso de javascript para determinar http o https de esta manera sea lo que sea que funcione – Ibu

+0

Entonces, ¿cómo puedo hacer referencia 'http: // a/b/c/g' con' // 'sin todo el'/a/b/c'? –

+0

Como necesita llegar al nivel primario, use '../ g' - usará el protocolo actual y llevará a' http: // a/b/c/g'. –

28

Son urls independientes del protocolo. Si la página web se publica en https, la solicitud utiliza https, si es http y luego http.

Paul Irish parece que los han popularizado al incluirla en su código repetitivo.

54

Estos son protocol relative URLs. 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 de IE que se queja de los recursos http y https en la misma página HTTPS).

Actualización: La documentación oficial in RFC 3986:

una referencia relativa que comienza con dos caracteres de barra se denomina una referencia a la red de la ruta; tales referencias son raramente usadas. Una referencia relativa de que comienza con un solo carácter de barra es denominada referencia de ruta absoluta. Una referencia relativa que no comienza con un carácter de barra diagonal se denomina referencia de ruta relativa.

+0

gran saber, pero el grado de cumplimiento es esto con navegadores populares. Una búsqueda rápida me dijo que no funciona con IE6 ... ¿es esta una función HTML5? –

+4

@Shane esto debería funcionar en todos los navegadores. ¿Tiene un enlace que dice que no funciona en IE6? –

+4

¡Bastante seguro de que una es una característica de IE1! –

2

Sé consciente de que se trata no sólo http o https independiente, sino también archivo, ftp, etc.

Esto significa que si se abre .htm archivo directamente en su navegador en localhost, navegador resolverá // como protocolo de archivo y su página no funcionará. Esto puede causar problemas en sitios web de lleno como aplicación "nativa", utilizando herramientas como electrones, PhoneGap, etc.

Ejemplo:

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

a

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