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?

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.


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.


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


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.