URI beginnend mit zwei Schrägstrichen… wie verhalten sie sich?

92

In letzter Zeit habe ich Arbeits Code-Blöcke wie folgt aus :

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

Und gemäß RFC 2396 (URI-Syntax) und RFC 2616 (HTTP 1.1) sind diese URI beginnend mit zwei Schrägstrichen gültig, aber leider erklären die RFCs sie nicht wirklich.

Kann mich jemand auf eine Ressource verweisen, die erklärt, wie Browser diese URIs verarbeiten werden / sollten / tun?

pagid
quelle

Antworten:

86

Die Ressource, nach der Sie suchen, ist der RFC 3986 .

Siehe Abschnitt 4.2 und Abschnitt 5.4. Zitat aus letzterem:

Beispiele für Referenzauflösungen

Innerhalb einer Darstellung mit einer genau definierten Basis-URI von:

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

Eine relative Referenz wird wie folgt in ihre Ziel-URI umgewandelt:

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

Dies bedeutet, dass, wenn der Basis-URI ist http://a/b/c/d;p?qund Sie ihn verwenden //g, die relative Referenz in transformiert wird http://g.

Daniel Vassallo
quelle
4
So kann dies eine Lösung für die Verwendung von Javascript sein, um http oder https auf diese Weise zu bestimmen, was auch immer es funktionieren wird
Ibu
Da Sie die übergeordnete Ebene erreichen müssen, verwenden Sie ../g- es wird das aktuelle Protokoll verwenden und zu führen http://a/b/c/g.
Boris S
Es mag eine Anfängerfrage sein, aber woher kommt diese Basis-URI? die Browser-URL-Leiste? der Kellner? ein Tag in der HTML-Seite?
Coderatchet
1
@thenaglecode: Die Antwort ist, es kommt darauf an. In XML / XHTML / HTML5 können Sie verwenden , xml:baseum es explizit auf ein beliebiges Element gesetzt . Standardmäßig ist der Basis-URI in HTML derselbe URI der Seite (aber in einer CSS-Datei ist der Basis-URI relativ zum CSS- URI , nicht zum enthaltenden HTML , aber der ältere IE hat ihn relativ zum HTML erstellt). In anderen Protokollen und Sprachen kann dies unterschiedlich sein (in XSLT hängt es beispielsweise vom aktuellen Element ab). Siehe auch <html:base>.
Abel
1
Wichtig - das Ergebnis ist nicht immer http! Dies hängt vom Protokoll des Seitenkontexts ab. Wenn der Kontext unter geladen wurde http://a/b/c/d;p?q, wird //gtatsächlich in aufgelöst http://g. Wenn die Seite jedoch so geladen wurde, http://a/b/c/d;p?qist das Ergebnis https://g. Und vergessen Sie auch nicht andere Protokolle wie file://(Seite wird von der Festplatte geladen) - was Ihnen definitiv viel Kopfschmerzen bereiten wird.
Andrey Tserkus
62

Dies sind protokollbezogene URLs. Sie zeigen auf eine Adresse und behalten das aktuelle Protokoll bei.

Diese Notation wird häufig verwendet, um das Problem "gemischter Inhalt" zu vermeiden (eine IE-Warnmeldung, die sich über httpund httpsRessourcen auf derselben HTTPS-Seite beschwert ).

Update: Offizielle Dokumentation in RFC 3986:

Eine relative Referenz, die mit zwei Schrägstrichen beginnt, wird als Netzwerkpfadreferenz bezeichnet. solche Referenzen werden selten verwendet. Eine relative Referenz, die mit einem einzelnen Schrägstrich beginnt, wird als absolute Pfadreferenz bezeichnet. Eine relative Referenz, die nicht mit einem Schrägstrich beginnt, wird als relative Pfadreferenz bezeichnet.

Pekka
quelle
Gut zu wissen, aber wie kompatibel ist dies mit gängigen Browsern. Eine schnelle Suche hat mir gesagt, dass es mit IE6 nicht funktioniert ... ist das eine HTML5-Funktion?
Shane N
4
@Shane das sollte in allen Browsern funktionieren. Haben Sie einen Link, der behauptet, dass er in IE6 nicht funktioniert?
Pekka
4
Ich bin mir ziemlich sicher, dass es sich um eine IE1-Funktion handelt!
Jon Hanna
Plus für die Erwähnung des Protokollverwandten
Tawfik Khalifeh
30

Sie sind protokollunabhängige URLs. Wenn die Webseite unter https bereitgestellt wird, verwendet die Anforderung https, wenn http, dann http.

Paul Irish scheint sie populär gemacht zu haben, indem er sie in seinen Boilerplate-Code aufgenommen hat.

meder omuraliev
quelle
1

Beachten Sie, dass es nicht nur http- oder https- unabhängig ist, sondern auch Datei , FTP usw.

Wenn Sie die .htm- Datei direkt in Ihrem Browser auf localhost öffnen , wird der Browser // als Dateiprotokoll aufgelöst und Ihre Seite funktioniert nicht. Es kann Probleme bei gepackten Websites als "native" App verursachen, die Tools wie Electron, PhoneGap usw. verwenden.

Beispiel:

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

zu

<script src="file://mywebsite.com/resource.js"></script>
lukyer
quelle