C'è qualche svantaggio per l'utilizzo di una doppia barra iniziale per ereditare il protocollo in un URL? ie src = “// domain.com”


148

Ho un foglio di stile che carica immagini da un dominio esterno e ne ho bisogno per caricare da https: // da pagine di ordini sicuri e http: // da altre pagine, in base all'URL corrente. Ho scoperto che l'avvio dell'URL con una doppia barra eredita il protocollo corrente. Tutti i browser supportano questa tecnica?

html ex:

<img src="//cdn.domain.com/logo.png" />

css ex:

.class { background: url(//cdn.domain.com/logo.png); }

1
questo rallenta il sito ???
TheBlackBenzKid

2
non c'è motivo per cui ciò dovrebbe avere alcun impatto sulle prestazioni, tranne nei casi che Meder ha elencato di seguito nella sua risposta.
Rob Volk,

Sembra che stavo per qualcosa. Alcuni mesi fa, gli sviluppatori di Google hanno iniziato a utilizzare questa convenzione nella loro pagina delle librerie Javascript ospitate developers.google.com/speed/libraries/devguide
Rob Volk,

10
Cosa succede se un tale file HTML viene caricato localmente (aperto direttamente con il browser)? Sembra che Firefox (28 in questo caso) non carichi la risorsa remota. Ha senso, perché allora HTTP non è il protocollo principale. Ma questo sarebbe uno svantaggio, secondo me.
Dr. Jan-Philip Gehrcke,

Risposte:


86

Se il browser supporta RFC 1808 Sezione 4 , RFC 2396 Sezione 5.2 o RFC 3986 Sezione 5.2 , utilizzerà effettivamente lo schema dell'URL della pagina per i riferimenti che iniziano con "//".


8
è supportato su tutti i principali browser? (IE7, IE8, FF, Chrome, Safari)
Rob Volk,

22
Considerando che il primo RFC per descriverlo, RFC 1808, è stato scritto 15 anni fa e che i riferimenti URL sono fondamentali per la funzionalità del sito Web, penso che sia sicuro affermare che ormai quasi tutti i principali browser lo supportano. Ma l'unico modo per saperlo con certezza è semplicemente provarlo tu stesso e vedere cosa succede.
Remy Lebeau,

2
Questa domanda è stata collegata da qualcuno che ha posto una domanda simile, e l'ho trovata in RFC 1630 l'anno prima (dichiarata diversamente, ma consentendo comunque il formato in questione). Avrebbe potuto essere in una forma o nell'altra del documento che era all'inizio ftp://info.cern.ch/pub/www/doc/http-spec.txtdel 1991, se qualcuno avesse una copia di archivio.
Jon Hanna,

4
"2014.12.17: Ora che SSL è incoraggiato per tutti e non ha problemi di prestazioni, questa tecnica è ora un anti-modello. Se la risorsa di cui hai bisogno è disponibile su SSL, usa sempre la risorsa https: //." (citazione citato da stackoverflow.com/a/27999789 )
joonas.fi

@ joonas.fi Questo ragionamento è al secondo anno. SSL ha ancora impatti sulle prestazioni e non è necessario in un gran numero di applicazioni. Preferisco usarlo, certo, ma non vorrei che fosse applicato, ad esempio, nel codice che distribuisco.
Otheus,

64

Se utilizzato su linko @import, IE7 / IE8 scaricherà il file due volte su http://paulirish.com/2010/the-protocol-relative-url/

Aggiornamento dal 2014:

Ora che SSL è incoraggiato per tutti e non ha problemi di prestazioni , questa tecnica è ora un anti-modello . Se la risorsa di cui hai bisogno è disponibile su SSL, usa sempre la https://risorsa.


18
Risolto in IE9, FWIW.
EricLaw,

@EricLaw è stato risolto in IE9 indipendentemente dalla modalità di rendering o solo in modalità Standard e ancora rotto in modalità Quirks?
scunliffe,

Sono quasi sicuro che questo sia stato risolto in tutte le modalità nello scanner lookahead. Hai visto altrimenti da qualche parte?
EricLaw,

SSL certamente ha un impatto sulle prestazioni. EFF non scrive interfacce server-server e quell'altro sito ha poca esperienza tecnica. Inoltre, è un anti-modello assumere che il fornitore di un sito web applichi tali restrizioni. Pertanto, le persone scrivono applicazioni CSS e javascript non dovrebbero basarsi sulla domanda del protocollo.
Otheus,

63

Un aspetto negativo si verifica se gli URL vengono visualizzati al di fuori del contesto di una pagina Web. Ad esempio, un messaggio di posta elettronica che si trova in un client di posta elettronica (ad esempio Outlook) non ha effettivamente un URL e quando si visualizza un messaggio contenente un URL relativo al protocollo, non esiste alcun contesto di protocollo evidente (il messaggio stesso è indipendente del protocollo utilizzato per recuperarlo, sia esso POP3, IMAP, Exchange, uucp o altro), quindi l'URL non ha alcun protocollo a cui essere relativo. Non ho studiato la compatibilità con i client di posta elettronica per vedere cosa fanno quando viene presentato con un gestore di protocollo mancante. Immagino che la maggior parte prenderà un'ipotesi su http. Apple Mail rifiuta di permetterti di inserire un URL senza protocollo. È analogo al modo in cui gli URL relativi non funzionano nell'e-mail a causa di un contesto altrettanto mancante.

Problemi simili potrebbero verificarsi in altri contesti non HTTP come tweet, messaggi SMS, documenti Word ecc.

La spiegazione più generale è che gli URL di protocollo anonimi non possono funzionare in modo isolato; ci deve essere un contesto rilevante. In una tipica pagina Web è quindi consigliabile inserire una libreria di script in quel modo, ma qualsiasi collegamento esterno dovrebbe sempre specificare un protocollo. Ho provato un semplice test: è //stackoverflow.commappato file:///stackoverflow.comin tutti i browser in cui l'ho provato, quindi non funzionano davvero da soli.


5
Questo è davvero un buon punto, stavo davvero pensando a questo mentre mi sono addormentato ieri sera. Un altro problema è che la versione httpso httppotrebbe non essere effettivamente disponibile, non si può sempre supporre che lo sia.
Wesley Murch,

1
Al di fuori di un browser sei da solo, per così dire. Non si può dire se l'e-mail o altri client conoscono javascript o css ecc. Quindi questo è praticamente un punto controverso sugli URL relativi?
chris,

Non un punto controverso. Molti client di posta elettronica supportano JS e i browser certamente possono caricarli da file://. È un caso d'uso minore, ma quando si presenta è importante.
Jun-Dai Bates-Kobashigawa,

Vorrei che ci fosse un modo per specificare l' uso http a meno che l'URL corrente sia https, nel qual caso utilizzare https , anziché specificare lo stesso protocollo con cui sono state caricate le pagine correnti , che è effettivamente ciò che //è.
Jun-Dai Bates-Kobashigawa,

2
Se si specifica un esempio <base href="https://www.google.com">, è possibile visualizzare il contenuto al di fuori del lato Web. o <img src="//www.google.com/images/srpr/logo11w.png">oppure<img src="images/srpr/logo11w.png">
zig

3

Il motivo potrebbe essere quello di fornire pagine Web portatili. Se la pagina esterna non viene trasportata crittografata (http), perché gli script collegati devono essere crittografati? Questa sembra essere una perdita di prestazioni non necessaria. Nel caso in cui la pagina esterna sia trasportata in modo sicuro crittografato (https), anche il contenuto collegato dovrebbe essere crittografato. Se la pagina è crittografata, il contenuto collegato no, IE sembra emettere un avviso di contenuto misto . Il motivo è che un utente malintenzionato può manipolare gli script lungo la strada. Vedere http://ie.microsoft.com/testdrive/Browser/MixedContent/Default.html?o=1 per una discussione più lunga.

La campagna HTTPS Everywhere di EFF suggerisce di utilizzare https ogni volta che è possibile. Oggi abbiamo la capacità del server di servire pagine Web sempre crittografate.



-2

Sembra essere una tecnica abbastanza comune ora. Non vi è alcun aspetto negativo, aiuta solo a unificare il protocollo per tutte le risorse sulla pagina, quindi dovrebbe essere usato ove possibile.

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.