Posso alterar todos os meus links http: // para apenas //?


240

Dave Ward diz:

Não é exatamente uma leitura leve, mas a seção 4.2 da RFC 3986 fornece URLs totalmente qualificados que omitem o protocolo (o HTTP ou HTTPS). Quando o protocolo de uma URL é omitido, o navegador usa o protocolo do documento subjacente.

Simplificando, esses URLs "sem protocolo" permitem que uma referência como essa funcione em todos os navegadores em que você experimenta:

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

Parece estranho a princípio, mas esse URL "sem protocolo" é a melhor maneira de referenciar conteúdo de terceiros disponível via HTTP e HTTPS.

Isso certamente resolveria vários erros de conteúdo misto que estamos vendo nas páginas HTTP - supondo que nossos ativos estejam disponíveis via HTTP e HTTPS.

Este navegador é totalmente compatível? Existem outras advertências?


Eu li sobre essa técnica no blog do IE há um tempo atrás. Mas quando tentei, não funcionou muito bem. Se meu site foi veiculado com HTTPS, o navegador (Chrome) ainda estava usando HTTP para URLs sem protocolo.
Christopher Ramírez

10
AVISO: lembre-se de NUNCA usuários URIs sem redirecionamentos em redirecionamentos HTTP 3xx !! Cabeçalhos HTTP não são compatíveis com este formato de URL. Se você precisar redirecionar dependendo do esquema, use mod_rewrite ou similar.
user2596282

1
@ user2596282 A experiência em versões modernas do Chrome e Firefox discorda de você, assim como a revisão (ainda em rascunho) do HTTP 1.1. especificação definida pelo grupo de trabalho HTTPbis (consulte svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/… ). Talvez o que você diz seja verdade em alguns navegadores; você conhece algum em particular que falha nos URLs relativos ao protocolo nos cabeçalhos de local?
Mark Amery


Não os use, eles são feios e redundantes.
IllidanS4 quer Monica de volta 10/08/14

Respostas:


204

Eu testei completamente antes de publicar. De todos os navegadores disponíveis para teste nos navegadores , só consegui encontrar um que não manipulasse corretamente o URL relativo do protocolo: um navegador obscuro * nix chamado Dillo .

Há duas desvantagens sobre as quais recebi comentários:

  1. URLs sem protocolo podem não funcionar conforme o esperado quando você "abre" um arquivo local no seu navegador, porque o protocolo base da página será o arquivo: ///. Especialmente quando você usa o URL sem protocolo para um recurso externo, como um ativo hospedado pela CDN. Porém, o uso de um servidor Web local como Apache ou IIS para testar endereços http: // localhost funciona bem.
  2. Aparentemente, há pelo menos um aplicativo de leitor de feed do iPhone que não manipula os URLs sem protocolo corretamente. Não sei qual deles tem o problema ou qual a sua popularidade. Para hospedar um arquivo JavaScript, isso não é um grande problema, pois os leitores de RSS geralmente ignoram o conteúdo de JavaScript. No entanto, pode ser um problema se você estiver usando esses URLs para mídias como imagens dentro de conteúdo que precisa ser distribuído via RSS (no entanto, esse aplicativo de leitor único em uma única plataforma provavelmente responde por um número muito marginal de leitores).

33
Embora o IE7 / 8 lide com URLs relativas ao protocolo (também conhecidas como URIs sem scênese) na maioria dos casos, quando as folhas de estilo são especificadas com essas URLs, ele será baixado duas vezes . (Assim diz Steve Souders )
lucasrizoli

3
Estou descobrindo que o IE6 tenta converter o URI em um relativo (ou seja, removendo uma das barras principais). Isso está em um linkelemento. Por exemplo, ao especificar //fonts.googleapis.com/css?family=Rokkitt:400,700, o IE6 tenta carregar http://mysite.com/fonts.googleapis.com/css/<...>. Não tão bom!
CBono

2
Descobri nos meus registros instâncias do que parecem ser robôs de aranha da web (origem desconhecida) tentando usar os links sem protocolo e não os manipulando corretamente também.
Kzqai

3
Eu já vi muito disso nos meus logs, não relacionados a URLs sem protocolo. Muitas dessas aranhas são incrivelmente mal escritas.
Dave Ward

11
É importante compreender que essas URLs são não protocol- menos , mas protocol- relativa . Eles obtêm o protocolo a partir do contexto e, na falta de um contexto, agem como URLs de arquivo na maioria dos navegadores, o que significa que eles quebram porque não carregam o conteúdo pretendido. Embora funcionem quando entregues por http, você descobrirá que, se salvar a página e carregar exatamente o mesmo HTML de um arquivo local, não funcionará, porque o contexto é diferente. Os únicos contextos em que você deve usá-los são http vs https.
Synchro 30/01

37

A questão de saber se um pode mudar todos os seus links para serem relativos ao protocolo pode ser discutível, considerando a questão de se deve ou não fazê-lo. De acordo com Paul Irish :

17/12/2014: Agora que o SSL é incentivado para todos e não tem problemas de desempenho, esta técnica agora é um antipadrão. Se o ativo necessário estiver disponível no SSL, sempre use o https: // ativo.


Eu estava pensando exatamente o mesmo. Qual é o sentido de fazer o download de um ativo externo por http, se estiver disponível também por https - mesmo se o site principal estiver usando http (o que não deveria, mas esse é outro tópico).
Joonas.fi

1
@ joonas.fi a única coisa que posso pensar é evitar avisos mistos HTTP / HTTPS que podem ser gerados por alguns navegadores
Ohad Schneider

3
Os avisos do @Ohad_Schneider são acionados apenas se o documento for carregado em segurança (https), mas em ativos em segurança (http). O que eu estava sugerindo é que você sempre pode carregar ativos com segurança, mesmo que o documento seja carregado com segurança. Não há aviso nem razão para não usar seguro, tornando todo o "URL relativo ao protocolo" desnecessário.
joonas.fi

1
@Ohad_Schneider oh desculpe, acho que interpretou mal o que você estava dizendo. Carregar ativos por https quando o documento terminar por http não deve gerar nenhum aviso. Mas o carregamento de ativos por http quando o documento termina em https (e provavelmente está bloqueado por padrão, pelo menos no Chrome). Você estava se referindo ao caso em que veicula seu site por https e recursos externos estão disponíveis apenas em http? Sim, isso pode ser um problema, mas acho que não há nenhum serviço sério de terceiros que não veicule seu conteúdo por https, caso contrário, eles devem fechar o negócio de qualquer maneira. :)
joonas.fi

@ joonas.fi Wut? O_o Se alguém tiver URLs relativos ao protocolo do site HTTPS (então), não ajudará a resolver a obtenção de ativos de terceiros por HTTP - de jeito nenhum. De qualquer forma, é melhor não ter esse logotipo SSL verde limpo na sua página HTTPS do que devolvê-lo ao HTTP novamente, apenas porque terceiros ainda não suportam HTTPS.
poige 24/09


15

Sim, as referências de caminho de rede já foram especificadas no RFC 1808 e devem funcionar com todos os navegadores.


11
É até recomendado e usado no código padrão
Felipe Lima

1
whit Sim, você não responde Sim para "Existem outras advertências?" ? ;)
Caspar Kleijne

2
@ Caspar Kleijne: expliquei o sim com o resto da frase.
Gumbo 28/01

1
Casper, Gumbo estava realmente respondendo às duas perguntas: "Isso é completamente compatível com vários navegadores? Existem outras advertências?" Sim é a resposta para a primeira pergunta.
Darren Griffith

4

Este navegador é totalmente compatível? Existem outras advertências?

Apenas para misturar isso, 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 host local (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:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

Eu postei esta resposta aqui também.

ATUALIZAÇÃO: o HTML5Boilerplate agora usa <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">depois de decidir descontinuar URLs relativos ao protocolo, veja aqui .


1

Não tive esses problemas ao usar: //domínio.com - mas você precisa adicionar dois pontos no início. Yoast escreveu um bom artigo sobre isso há algum tempo. Mas está perdido em sua pilha de postagens no blog.


voto negativo por não indicar onde o adicional: é útil. Em todo lugar que acidentalmente deixei o ":" quebrou o link
rob

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.