Eu tenho o seguinte elemento:
<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script>
Nesse caso, o site é HTTPS, mas também pode ser apenas HTTP. (O arquivo JS está em outro domínio.) Gostaria de saber se é válido fazer o seguinte por uma questão de conveniência:
<script type="text/javascript" src="//cdn.example.com/js_file.js"></script>
Gostaria de saber se é válido remover o http:
ou https:
?
Parece funcionar em todos os lugares que testei, mas existem casos em que não funciona?
Respostas:
Um URL relativo sem um esquema (http: ou https :) é válido, de acordo com a RFC 3986: "Uniform Resource Identifier (URI): sintaxe genérica", seção 4.2 . Se um cliente engasgar com isso, a culpa é do cliente, porque ele não está em conformidade com a sintaxe do URI especificada na RFC.
Seu exemplo é válido e deve funcionar. Eu mesmo usei esse método de URL relativo em sites com tráfego intenso e não recebi nenhuma reclamação. Além disso, testamos nossos sites no Firefox, Safari, IE6, IE7 e Opera. Todos esses navegadores entendem esse formato de URL.
fonte
É garantido que funcione em qualquer navegador convencional (não estou levando em consideração navegadores com menos de 0,05% de participação de mercado). Caramba, ele funciona no Internet Explorer 3.0.
O RFC 3986 define um URI como composto pelas seguintes partes:
Ao definir URIs relativos ( Seção 5.2 ), você pode omitir qualquer uma dessas seções, sempre começando pela esquerda. No pseudo-código, fica assim:
O URI que você está descrevendo é um URI relativo sem esquema.
fonte
Se a página pai foi carregada
file://
, provavelmente não funcionará (ela tentará obter ofile://cdn.example.com/js_file.js
que, é claro, você também poderia fornecer localmente).fonte
script src="//..."
não estivesse funcionando! Eu estava abrindo o arquivo html localmente!Muitas pessoas chamam isso de URL relativa ao protocolo.
Isso causa um download duplo de arquivos CSS no IE 7 e 8 .
fonte
Aqui duplico a resposta em Recursos ocultos do HTML :
fonte
É perfeitamente válido deixar de fora o protocolo. A especificação de URL tem sido muito clara sobre isso há anos, e ainda não encontrei um navegador que não o entenda. Não sei por que essa técnica não é mais conhecida; é a solução perfeita para o espinhoso problema de cruzar os limites HTTP / HTTPS. Mais aqui: transições HTTP-https e URLs relativos
fonte
Só para colocar isso em ordem, se você estiver desenvolvendo em um servidor local, pode não funcionar. Você precisa especificar um esquema, caso contrário, o navegador pode assumir que
src="//cdn.example.com/js_file.js"
ésrc="file://cdn.example.com/js_file.js"
, o que será interrompido, pois você não está hospedando este recurso localmente.O Microsoft Internet Explorer parece ser particularmente sensível a isso, consulte esta pergunta: Não é possível carregar o jQuery no Internet Explorer no localhost (WAMP)
Você provavelmente sempre tentaria encontrar uma solução que funcione em todos os seus ambientes com a menor quantidade de modificações necessárias.
A solução usada pelo HTML5Boilerplate é ter um fallback quando o recurso não for carregado corretamente, mas isso só funcionará se você incorporar uma verificação:
ATUALIZAÇÃO: o HTML5Boilerplate agora usa
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
após decidir descontinuar URLs relativos ao protocolo, consulte [aqui] [3].fonte
Seguindo a referência do gnud, a seção 5.2 do RFC 3986 diz:
Então
//
está correto :-)fonte
Sim, isso está documentado na RFC 3986 , seção 5.2:
(editar: Opa, minha referência RFC estava desatualizada).
fonte
É realmente correto, como outras respostas afirmaram. Você deve observar, no entanto, que alguns rastreadores da Web dispararão 404s para eles solicitando-os no seu servidor como se fosse um URL local. (Eles desconsideram a barra dupla e a tratam como uma barra única).
Você pode configurar uma regra em seu servidor da web para capturá-las e redirecioná-las.
Por exemplo, com o Nginx, você adicionaria algo como:
Observe, porém, que se você usar períodos em seus URIs, precisará aumentar a especificidade ou isso acabará redirecionando essas páginas para domínios inexistentes.
Além disso, esse é um regex bastante massivo para ser executado em cada consulta - na minha opinião, vale a pena punir navegadores não compatíveis com 404s por um (leve) desempenho atingido na maioria dos navegadores compatíveis.
fonte
Estamos vendo erros 404 em nossos logs ao usar //somedomain.com como referências a arquivos JS.
As referências que causam os 404s aparecem assim: ref:
Solicitação 404:
Com isso aparecendo regularmente em nossos registros do servidor da Web, é seguro dizer que: Todos os navegadores e Bots NÃO respeitam a RFC 3986, seção 4.2. A aposta mais segura é incluir o protocolo sempre que possível.
fonte
1. Resumo
Resposta para 2019: você ainda pode usar URLs relativos ao protocolo, mas essa técnica é um antipadrão .
Além disso:
Migrar de URLs relativos ao protocolo para
https://
ele seria bom.2. Relevância
Esta resposta é relevante para janeiro de 2019. No futuro, os dados desta resposta podem estar obsoletos.
3. Anti-padrão
3.1 Argumentação
Paul Irish - engenheiro front-end e defensor do desenvolvedor do Google Chrome - escreveu em 2014, dezembro :
3.2 Outros links
3.3 Exemplos
https
4. Processo de desenvolvimento
Por exemplo, tento usar o console limpo .
KiraCleanConsole__cdn_links_demo.html
:Ligação
//cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
é válido, mas estou recebendo um erro.Preste atenção
file://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
e leia as respostas Thilo e bg17aw sobrefile://
.Eu não sabia sobre esse comportamento e não conseguia entender por que tenho problemas como esse para pageres .
5. Ferramentas de terceiros
Eu uso o pacote de texto sublime de URLs clicáveis . Use-o, eu posso simplesmente abrir links do meu editor de texto no navegador.
Os dois links no exemplo são válidos. Mas o primeiro link que posso abrir com sucesso no navegador usa URLs clicáveis, segundo link - não. Isso pode não ser muito conveniente.
6. Conclusão
Sim:
Developing process
item, poderá definir seu fluxo de trabalho de desenvolvimento.Third-party tools
item, você pode contribuir com ferramentas.Mas você não precisa desses problemas adicionais. Leia as informações por links no
Anti-pattern
item: URLs relativas ao protocolo estão obsoletas.fonte
O padrão que vejo no html5-boilerplate é:
Ele roda sem problemas em diferentes esquemas como
http
,https
,file
.fonte
https://
para tudohttps://
todos os lugares é que você deve verificar todos os seus links externos para ver se eles realmente o suportam e alterá-los parahttp://
se não o fizerem (caso contrário, eles não funcionarão). Isso pode ser problemático com um grande número de links.https://
deve (ou pode) ser usado em todos os links que não estão corretos.Como seu exemplo está vinculando a um domínio externo, se você estiver usando HTTPS, verifique se o domínio externo também está configurado para SSL. Caso contrário, seus usuários poderão ver erros SSL e / ou 404 (por exemplo, versões mais antigas do Plesk armazenam HTTP e HTTPS em pastas separadas). Para CDNs, não deve ser um problema, mas para qualquer outro site.
Em uma nota lateral, testado enquanto atualizamos um site antigo e também funciona na parte url = de um META REFRESH.
fonte