URI começando com duas barras ... como eles se comportam?

92

Ultimamente, vi blocos de código funcionando como este:

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

E de acordo com o RFC 2396 (Sintaxe URI) e o RFC 2616 (HTTP 1.1), esses URI começando com duas barras são válidos, mas infelizmente os RFCs não os explicam.

Alguém pode me indicar um recurso que explique como os navegadores irão / devem / processam esses URIs?

pagão
fonte

Respostas:

86

O recurso que você está procurando é o RFC 3986 .

Consulte a Seção 4.2 e a Seção 5.4. Citando o último:

Exemplos de resolução de referência

Em uma representação com um URI de base bem definido de:

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

uma referência relativa é transformada em seu URI de destino da seguinte maneira:

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

Isso significa que quando o URI básico é http://a/b/c/d;p?qe você usa //g, a referência relativa é transformada em http://g.

Daniel Vassallo
fonte
4
então isso pode ser uma solução para usar javascript para determinar http ou https desta forma, seja o que for que funcionará
Ibu
Como você precisa atingir o nível pai, use ../g- ele usará o protocolo atual e conduzirá para http://a/b/c/g.
Boris S
Pode ser uma pergunta novata, mas de onde vem esse URI de base? a barra de url do navegador? o servidor? uma tag na página html?
coderatchet
1
@thenaglecode: a resposta é: depende. Em XML / XHTML / HTML5 você pode usar xml:basepara defini-lo explicitamente em qualquer elemento . Por padrão, em HTML, o URI básico é o mesmo URI da página (mas dentro de um arquivo CSS, o URI básico é relativo ao uri CSS, não ao HTML que o contém , mas o IE mais antigo o tornou em relação ao HTML). Em outros protocolos e linguagens, pode ser diferente (em XSLT, depende do item atual, por exemplo). Veja também <html:base>.
Abel,
1
Importante - o resultado nem sempre é http! Depende do protocolo do contexto da página. Se o contexto foi carregado em http://a/b/c/d;p?q, então //grealmente resolve para http://g. Mas se a página foi carregada como http://a/b/c/d;p?qentão o resultado será https://g. E também não se esqueça de outros protocolos como file://(a página é carregada do disco) - o que definitivamente vai te dar muita dor de cabeça.
Andrey Tserkus
62

Esses são URLs relativos ao protocolo. Eles apontam para um endereço, mantendo o protocolo atual.

Essa notação é freqüentemente usada para evitar o problema de "conteúdo misto" (uma mensagem de aviso do IE reclamando httpe httpsrecursos na mesma página HTTPS).

Atualização: documentação oficial no RFC 3986:

Uma referência relativa que começa com dois caracteres de barra é chamada de referência de caminho de rede; tais referências raramente são usadas. Uma referência relativa que começa com um único caractere de barra é chamada de referência de caminho absoluto. Uma referência relativa que não começa com uma barra é denominada referência de caminho relativo.

Pekka
fonte
É bom saber, mas quão compatível é isso com navegadores populares. Uma pesquisa rápida me disse que não funciona com o IE6 ... isso é um recurso HTML5?
Shane N,
4
@Shane isso deve funcionar em todos os navegadores. Você tem um link afirmando que ele não funciona no IE6?
Pekka,
4
Tenho certeza de que esse é um recurso do IE1!
Jon Hanna
mais por mencionar o protocolo relativo
Tawfik Khalifeh
30

Eles são urls independentes de protocolo. Se a página da web for servida em https, a solicitação usará https, se for http, então http.

Paul Irish parece tê-los popularizado incluindo-os em seu código clichê.

Meder Omuraliev
fonte
1

Esteja ciente de que não é apenas independente de http ou https , mas também de arquivo , ftp , etc.

Isso significa que se você abrir o arquivo .htm diretamente em seu navegador no localhost, o navegador resolverá // como protocolo de arquivo e sua página não funcionará. Isso pode causar problemas em sites compactados como aplicativos "nativos" usando ferramentas como Electron, PhoneGap, etc.

Exemplo:

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

para

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