URI zaczynające się od dwóch ukośników… jak się zachowują?

93

Ostatnio widziałem działające bloki kodu w ten sposób:

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

I zgodnie z RFC 2396 (składnia URI) i RFC 2616 (HTTP 1.1) te URI zaczynające się od dwóch ukośników są prawidłowe, ale niestety specyfikacje RFC tak naprawdę ich nie wyjaśniają.

Czy ktoś może wskazać mi zasób wyjaśniający, w jaki sposób przeglądarki będą / powinny / przetwarzają te identyfikatory URI?

pagid
źródło

Odpowiedzi:

86

Zasób, którego szukasz, to RFC 3986 .

Patrz sekcja 4.2 i sekcja 5.4. Cytując z tego ostatniego:

Przykładowe rozwiązania referencyjne

W ramach reprezentacji z dobrze zdefiniowanym podstawowym identyfikatorem URI:

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

odniesienie względne jest przekształcane na jego docelowy identyfikator URI w następujący sposób:

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

Oznacza to, że gdy podstawowy identyfikator URI jest http://a/b/c/d;p?qużywany //g, a odniesienie względne jest przekształcane na http://g.

Daniel Vassallo
źródło
4
więc czy to może być rozwiązanie do używania javascript do określania http lub https w ten sposób, cokolwiek to będzie działać
Ibu
Ponieważ musisz osiągnąć poziom nadrzędny, użyj ../g- użyje bieżącego protokołu i doprowadzi do http://a/b/c/g.
Boris S
Może to być pytanie dla początkujących, ale skąd pochodzi ten podstawowy identyfikator URI? pasek adresu przeglądarki? serwer? tag na stronie html?
coderatchet
1
@thenaglecode: odpowiedź brzmi: to zależy. W XML / XHTML / HTML5 możesz użyć xml:basedo jawnego ustawienia dowolnego elementu . Domyślnie w HTML podstawowy URI jest tym samym URI strony (ale wewnątrz pliku CSS podstawowy URI jest względny w stosunku do CSS uri, a nie do zawierającego HTML , ale starszy IE uczynił go względnym względem HTML). W innych protokołach i językach może być inny (na przykład w XSLT zależy to od bieżącego elementu). Zobacz także <html:base>.
Abel
1
Ważne - wynik nie zawsze jest http! Zależy to od protokołu kontekstu strony. Jeśli kontekst został załadowany pod http://a/b/c/d;p?q, to //grzeczywiście jest rozwiązywany na http://g. Ale jeśli strona została załadowana jako, http://a/b/c/d;p?qwynik będzie https://g. A także nie zapomnij o innych protokołach, takich jak file://(strona ładuje się z dysku) - co z pewnością przyprawi Cię o wiele bólu głowy.
Andrey Tserkus
62

Są to adresy URL zależne od protokołu. Wskazują na adres, zachowując aktualny protokół.

Notacja ta jest często używana, aby uniknąć problemu z „mieszaną zawartością” (komunikat ostrzegawczy IE dotyczący reklamacji httpi httpszasobów na tej samej stronie HTTPS).

Aktualizacja: Oficjalna dokumentacja w RFC 3986:

Względne odniesienie rozpoczynające się od dwóch ukośników jest nazywane odniesieniem do ścieżki sieciowej; takie odniesienia są rzadko używane. Względne odwołanie, które zaczyna się od pojedynczego znaku ukośnika, jest nazywane odwołaniem do ścieżki bezwzględnej. Względne odwołanie, które nie zaczyna się od ukośnika, jest nazywane odwołaniem do ścieżki względnej.

Pekka
źródło
Dobrze wiedzieć, ale jak bardzo jest to zgodne z popularnymi przeglądarkami. Szybkie wyszukiwanie pokazało mi, że nie działa z IE6 ... czy to jest funkcja HTML5?
Shane N
4
@Shane to powinno działać we wszystkich przeglądarkach. Czy masz link, który twierdzi, że nie działa w IE6?
Pekka
4
Jestem prawie pewien, że jest to funkcja IE1!
Jon Hanna,
plus za wzmiankę o względnym protokole
Tawfik Khalifeh,
30

Są to adresy URL niezależne od protokołu. Jeśli strona internetowa jest obsługiwana za pomocą protokołu https, żądanie używa protokołu https, jeśli http to http.

Wydaje się, że Paul Irish spopularyzował je, włączając je do swojego standardowego kodu.

meder omuraliev
źródło
1

Należy pamiętać, że jest to nie tylko niezależny od http lub https , ale także plik , ftp itp.

Oznacza to, że jeśli otworzysz plik .htm bezpośrednio w przeglądarce na hoście lokalnym, przeglądarka rozwiąże // jako protokół pliku i Twoja strona nie będzie działać. Może powodować problemy w spakowanych witrynach internetowych jako „natywna” aplikacja korzystająca z narzędzi takich jak Electron, PhoneGap itp.

Przykład:

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

do

<script src="file://mywebsite.com/resource.js"></script>
lukyer
źródło