URI che inizia con due barre ... come si comportano?


92

Ultimamente ho visto blocchi di codice funzionanti come questo:

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

E secondo RFC 2396 (URI Syntax) e RFC 2616 (HTTP 1.1) questi URI che iniziano con due barre sono validi, ma sfortunatamente gli RFC non li spiegano realmente.

Qualcuno può indicarmi una risorsa che spiega come i browser elaboreranno / dovrebbero / elaboreranno questi URI?

Risposte:


86

La risorsa che stai cercando è RFC 3986 .

Vedere la sezione 4.2 e la sezione 5.4. Citando da quest'ultimo:

Esempi di risoluzione di riferimento

All'interno di una rappresentazione con un URI di base ben definito di:

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

un riferimento relativo viene trasformato nel suo URI di destinazione come segue:

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

Ciò significa che quando l'URI di base è http://a/b/c/d;p?qe si utilizza //g, il riferimento relativo viene trasformato in http://g.


4
quindi questa può essere una soluzione per utilizzare javascript per determinare http o https in questo modo, qualunque cosa funzionerà
Ibu

Poiché è necessario raggiungere il livello genitore, utilizzare ../g- utilizzerà il protocollo corrente e porterà a http://a/b/c/g.
Boris S

Potrebbe essere una domanda per principianti, ma da dove viene questo URI di base? la barra degli indirizzi del browser? il server? un tag nella pagina html?
coderatchet

1
@thenaglecode: la risposta è, dipende. In XML / XHTML / HTML5 puoi usarlo xml:baseper impostarlo esplicitamente su qualsiasi elemento . Per impostazione predefinita in HTML l'URI di base è lo stesso URI della pagina (ma all'interno di un file CSS, l'URI di base è relativo all'URI CSS, non l'HTML che lo contiene , ma il vecchio IE lo rendeva relativo all'HTML). In altri protocolli e linguaggi, può essere diverso (in XSLT, dipende dall'elemento corrente, ad esempio). Vedi anche <html:base>.
Abel

1
Importante: il risultato non è sempre http! Dipende dal protocollo del contesto della pagina. Se il contesto è stato caricato in http://a/b/c/d;p?q, allora //geffettivamente si risolve in http://g. Ma se la pagina è stata caricata così, http://a/b/c/d;p?qil risultato sarà https://g. Inoltre, non dimenticare altri protocolli come file://(la pagina viene caricata dal disco), il che ti darà sicuramente molto mal di testa.
Andrey Tserkus

62

Questi sono URL relativi al protocollo. Indicano un indirizzo, mantenendo il protocollo corrente.

Questa notazione viene spesso utilizzata per evitare il problema del "contenuto misto" (un messaggio di avviso di IE che si lamenta httpe le httpsrisorse sulla stessa pagina HTTPS).

Aggiornamento: documentazione ufficiale in RFC 3986:

Un riferimento relativo che inizia con due caratteri barra viene definito un riferimento al percorso di rete; tali riferimenti sono usati raramente. Un riferimento relativo che inizia con un singolo carattere barra viene definito riferimento a percorso assoluto. Un riferimento relativo che non inizia con un carattere barra viene definito riferimento a percorso relativo.


Bello da sapere, ma quanto è compatibile con i browser più diffusi. Una rapida ricerca mi ha detto che non funziona con IE6 ... è una funzionalità HTML5 ??
Shane N

4
@Shane questo dovrebbe funzionare in tutti i browser. Hai un collegamento che afferma che non funziona in IE6?
Pekka

4
Sono abbastanza sicuro che sia una funzionalità di IE1!
Jon Hanna

più per menzionare il parente del protocollo
Tawfik Khalifeh


1

Tieni presente che non è solo indipendente da http o https , ma anche da file , ftp , ecc.

Significa che se apri il file .htm direttamente nel tuo browser su localhost, il browser risolverà // come protocollo file e la tua pagina non funzionerà. Può causare problemi in siti Web imballati come app "native" utilizzando strumenti come Electron, PhoneGap, ecc.

Esempio:

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

per

<script src="file://mywebsite.com/resource.js"></script>
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.