Czy jest jakaś wada używania wiodącego podwójnego ukośnika do dziedziczenia protokołu w adresie URL? tj. src = „// domena.com”

148

Mam arkusz stylów, który ładuje obrazy z domeny zewnętrznej i potrzebuję go do załadowania z https: // ze stron bezpiecznego zamówienia i http: // z innych stron, na podstawie bieżącego adresu URL. Okazało się, że rozpoczęcie adresu URL podwójnym ukośnikiem dziedziczy obecny protokół. Czy wszystkie przeglądarki obsługują tę technikę?

html ex:

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

css ex:

.class { background: url(//cdn.domain.com/logo.png); }
Rob Volk
źródło
1
czy to spowalnia działanie witryny ???
TheBlackBenzKid
2
nie ma powodu, dla którego powinno to mieć jakikolwiek wpływ na wydajność, z wyjątkiem przypadków, które Meder wymieniła poniżej w swojej odpowiedzi.
Rob Volk,
Wygląda na to, że coś miałem. Kilka miesięcy temu programiści Google zaczęli stosować tę konwencję na swojej stronie z bibliotekami hostowanych skryptów Javascript developers.google.com/speed/libraries/devguide
Rob Volk
10
A co, jeśli taki plik HTML jest ładowany lokalnie (otwierany bezpośrednio w przeglądarce)? Wygląda na to, że Firefox (w tym przypadku 28) nie ładuje zdalnego zasobu. Ma to sens, ponieważ wtedy HTTP nie jest protokołem nadrzędnym. Ale moim zdaniem byłaby to wada.
Dr Jan-Philip Gehrcke,

Odpowiedzi:

86

Jeśli przeglądarka obsługuje RFC 1808 sekcja 4 , RFC 2396 sekcja 5.2 lub RFC 3986 sekcja 5.2 , to rzeczywiście będzie używać schematu adresu URL strony dla odniesień zaczynających się od „//”.

Remy Lebeau
źródło
8
czy jest to obsługiwane we wszystkich głównych przeglądarkach? (IE7, IE8, FF, Chrome, Safari)
Rob Volk
22
Biorąc pod uwagę, że pierwszy dokument RFC, który go opisał, RFC 1808, został napisany 15 lat temu, a odniesienia do adresów URL są kluczem do funkcjonalności witryny, myślę, że można bezpiecznie powiedzieć, że prawie wszystkie główne przeglądarki już go obsługują. Ale jedynym sposobem, aby mieć pewność, jest po prostu spróbować samemu i zobaczyć, co się stanie.
Remy Lebeau
2
To pytanie było powiązane z kimś, kto zadał podobne pytanie i znalazłem je w RFC 1630 rok wcześniej (podane inaczej, ale nadal dopuszczam ten format). Mogło to być w takiej czy innej formie dokumentu, który był na ftp://info.cern.ch/pub/www/doc/http-spec.txtpoczątku 1991 roku, gdyby ktoś miał kopię archiwalną.
Jon Hanna,
4
„2014.12.17: Teraz, gdy SSL jest zalecany dla wszystkich i nie ma problemów z wydajnością, ta technika jest teraz anty-wzorcem. Jeśli potrzebny zasób jest dostępny w SSL, zawsze używaj zasobu https: //”. (cytat za stackoverflow.com/a/27999789 )
joonas.fi
@ joonas.fi To rozumowanie jest drugie. SSL nadal ma wpływ na wydajność i nie jest potrzebny w wielu aplikacjach. Wolę go używać, jasne, ale nie chciałbym, aby było to egzekwowane na przykład w kodzie, który wdrażam.
Otheus
64

W przypadku korzystania z linklub @import, IE7 / IE8 pobierze plik dwukrotnie na http://paulirish.com/2010/the-protocol-relative-url/

Aktualizacja z 2014 roku:

Teraz, gdy SSL jest zalecany dla wszystkich i nie ma problemów z wydajnością , ta technika jest teraz anty-wzorcem . Jeśli potrzebny zasób jest dostępny z protokołem SSL, zawsze używaj go https://.

meder omuraliev
źródło
18
Naprawiono w IE9, FWIW.
EricLaw
@EricLaw czy to naprawione w IE9 niezależnie od trybu renderowania, czy tylko w trybie standardowym i nadal zepsute w trybie osobliwości?
scunliffe
Jestem prawie pewien, że zostało to naprawione we wszystkich trybach w skanerze lookahead. Czy widziałeś gdzieś inaczej?
EricLaw
SSL z pewnością nie mają wpływ na wydajność. EFF nie pisze interfejsów serwer-serwer, a ta inna witryna ma niewielką wiedzę techniczną. Co więcej, anty-wzorcem jest założenie, że sprzedawca witryny internetowej będzie egzekwował takie ograniczenia. Dlatego ludzie piszący aplikacje CSS i javascript nie powinni polegać na pytaniu o protokół.
Otheus
63

Jeden minus występuje, jeśli Twoje adresy URL są przeglądane poza kontekstem strony internetowej. Na przykład wiadomość e-mail znajdująca się w kliencie poczty e-mail (powiedzmy Outlook) faktycznie nie ma adresu URL, a kiedy przeglądasz wiadomość zawierającą adres URL zależny od protokołu, nie ma w ogóle oczywistego kontekstu protokołu (sama wiadomość jest niezależna protokołu używanego do pobrania, czy to POP3, IMAP, Exchange, uucp czy cokolwiek innego), więc adres URL nie ma protokołu, do którego mógłby być względny. Nie badałem zgodności z klientami poczty e-mail, aby zobaczyć, co robią, gdy pojawia się brakujący moduł obsługi protokołu - domyślam się, że większość zgadnie z http. Apple Mail odmawia wprowadzenia adresu URL bez protokołu. Jest to analogiczne do sposobu, w jaki względne adresy URL nie działają w wiadomościach e-mail z powodu podobnie brakującego kontekstu.

Podobne problemy mogą wystąpić w innych kontekstach innych niż HTTP, takich jak tweety, wiadomości SMS, dokumenty Word itp.

Bardziej ogólnym wyjaśnieniem jest to, że anonimowe adresy URL protokołów nie mogą działać w izolacji; tam musi być istotnym kontekstem. W przypadku typowej strony internetowej można więc w ten sposób pobrać bibliotekę skryptów, ale wszelkie linki zewnętrzne powinny zawsze określać protokół. Wypróbowałem jeden prosty test: //stackoverflow.commapy file:///stackoverflow.comwe wszystkich przeglądarkach, w których go wypróbowałem, więc naprawdę nie działają same.

Synchro
źródło
5
To naprawdę dobra uwaga, właściwie myślałem o tym, zasypiając zeszłej nocy. Inną kwestią jest to, że wersja httpslub httpmoże w rzeczywistości nie być dostępna, nie zawsze można założyć, że jest.
Wesley Murch
1
Poza przeglądarką jesteś sam, że tak powiem. Nie ma mowy o tym, czy e-mail lub inny klient wie o javascript lub css itp. Więc jest to raczej kwestia dyskusyjna dotycząca względnych adresów URL?
chris
Nie podlega dyskusji. Wiele klientów poczty e-mail obsługuje JS, a przeglądarki z pewnością obsługują podczas ładowania z file://. Jest to drobny przypadek użycia, ale kiedy się pojawia, jest ważny.
Jun-Dai Bates-Kobashigawa
Żałuję, że nie ma sposobu, aby określić użycie http, chyba że bieżący adres URL to https, w takim przypadku użyj protokołu https , zamiast określać użycie tego samego protokołu, za pomocą którego ładowano bieżące strony , co w rzeczywistości //jest tym, czym jest.
Jun-Dai Bates-Kobashigawa
2
Jeśli podasz np. <base href="https://www.google.com">, Możesz przeglądać zawartość poza stroną internetową. albo <img src="//www.google.com/images/srpr/logo11w.png">albo<img src="images/srpr/logo11w.png">
zig
3

Powodem może być zapewnienie przenośnych stron internetowych. Jeśli strona zewnętrzna nie jest przesyłana w postaci zaszyfrowanej (http), dlaczego połączone skrypty mają być szyfrowane? Wydaje się, że jest to niepotrzebna utrata wydajności. W przypadku, gdy zewnętrzna strona jest bezpiecznie przesyłana w postaci zaszyfrowanej (https), zawartość, do której prowadzi łącze, również powinna być zaszyfrowana. Jeśli strona jest zaszyfrowana, a linkowana zawartość nie, IE wydaje ostrzeżenie o zawartości mieszanej . Powodem jest to, że napastnik może po drodze manipulować skryptami. Więcej informacji można znaleźć pod adresem http://ie.microsoft.com/testdrive/Browser/MixedContent/Default.html?o=1 .

Kampania HTTPS Everywhere z EFF sugeruje używanie protokołu HTTPS wszędzie tam, gdzie to możliwe. W dzisiejszych czasach mamy możliwość serwowania stron internetowych zawsze zaszyfrowanych.

koppor
źródło
-2

Wydaje się, że jest to obecnie dość powszechna technika. Nie ma wady, pomaga tylko ujednolicić protokół dla wszystkich zasobów na stronie, dlatego należy go używać wszędzie tam, gdzie to możliwe.

Ramashish Baranwal
źródło