Was bedeutet der doppelte Schrägstrich in URLs?


32

Was bedeuten doppelte Schrägstriche in URLs genau?

Beispielsweise:

  • http://www.example.com/A/B//C/

Bitte beachten Sie, dass ich mich nicht direkt danach auf den Anfang beziehe http:.

Antworten:


32

Das ist ein Fehler im Programmierer / Entwickler-Code. Wenn Sie diese beiden URLs vergleichen:

  • http://www.example.com/A/B/C/
  • http://www.example.com/A/B//C/

Sie sehen unterschiedlich aus, aber wenn Sie sie besuchen, funktionieren beide in den meisten modernen Browsern.

Dies ist etwas, das Sie beheben möchten. Wenn Sie den doppelten Schrägstrich verwenden, können die Webcrawler von Google verwirrt werden und glauben, dass es zwei Versionen der Seite gibt.


11
Eigentlich hat das Laden der Seite nichts mit dem Browser zu tun , sondern dass der Server den zusätzlichen Schrägstrich ignoriert. Das hat lange gedauert, siehe die Antwort, die ich gepostet habe.
Josh3736

33

Wie von @RandomBen erwähnt , ist der doppelte Schrägstrich höchstwahrscheinlich das Ergebnis eines Fehlers.

Das Laden der Seite hat nichts mit dem Browser zu tun , sondern dass der Server den zusätzlichen Schrägstrich ignoriert. Der Browser macht nichts Besonderes mit zusätzlichen Schrägstrichen in der URL, er sendet sie nur in der Anfrage mit:

GET /A/B//C/D HTTP/1.1
Host: www.example.com
...

Es sieht so aus, als würden die aktuellen Versionen von Apache und IIS die zusätzlichen Schrägstriche beim Auflösen des Pfads ignorieren und das Dokument zurückgeben, das zurückgegeben worden wäre, wenn die URL keine zusätzlichen Schrägstriche gehabt hätte. Allerdings , Browser (I getestet IE 8 und Chrome 9) durch irgendwelche relativen URLs verwirren lassen (mit Eltern Pfadkomponenten) von Ressourcen auf der Seite, die schlechten Ergebnisse liefert. Zum Beispiel, wenn eine Seite hat:

<link rel="stylesheet" href="../../style.css" type="text/css" />

Beim Laden der Seite /a/b/c/fordert der Browser an /a/style.css. Wenn jedoch - aus welchem ​​Grund auch immer - eine Anfrage gestellt /a/b//c/wird (und der Server den zusätzlichen Schrägstrich ignoriert), fordert der Browser am Ende eine Anfrage an /a/b/style.css, die es nicht gibt. Hoppla, die Seite sieht hässlich aus.

(Dies wird offensichtlich nicht passieren, wenn die URL keine übergeordnete Pfadkomponente hat ( ..) oder absolut ist.)

Es ist meine Meinung , dass Apache und IIS (und wahrscheinlich auch andere) handeln falsch wie /a/b/c/und /a/b//c/technisch repräsentieren zwei unterschiedliche Ressourcen. Laut RFC 2396 ist jeder Schrägstrich signifikant:

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

So /a/b/c/besteht aus drei Segmenten: "a", "b" und "c"; /a/b//c/besteht eigentlich aus vier: "a", "b", "" (die leere Zeichenfolge) und "c". Ob die leere Zeichenfolge ein gültiges Dateisystemverzeichnis ist oder nicht, ist ein Detail der Serverplattform. (Und logischerweise bedeutet dies, dass die Browser tatsächlich korrekt funktionieren , wenn relative URLs mit übergeordneten Pfadkomponenten analysiert werden. In meinem Beispiel gehen sie über das Verzeichnis "c" und das Verzeichnis "" hinaus und überlassen uns die Anforderung style.cssvon "b".)

Wenn Sie Apache mit verwenden mod_rewrite, gibt es eine ziemlich einfache Lösung :

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

Dadurch wird eine HTTP- 301 Moved PermanentlyUmleitung ausgegeben, sodass doppelte Schrägstriche aus der URL entfernt werden.


2
Wäre es nicht besser, wenn Ihre mod_rewriteLösung auch 3, 4, ... Schrägstriche berücksichtigt? Etwas in der Art von /{2,}? (Vorausgesetzt, Apache erlaubt diese Art von Quantifizierer, ich bin nicht so vertraut damit)
Ward Muylaert

+1 - Danke für die extra Info. Ich habe es nicht so gesehen!
Ben Hoffman

3
Es ist nicht falsch Verhalten: a/bund a//bin der Tat sind zwei verschiedene URL - Pfade, aber nichts verbietet den Server aus der gleichen Quelle für beide zurückkehren , wenn sie will. Ich stimme Ihnen jedoch zu, dass die Rückgabe einer 301-Weiterleitung in der Praxis sinnvoller erscheint.
Ilmari Karonen

4
@IlmariKaronen: Es ist absolut falsches Verhalten, weil (1) dieses Verhalten automatisch eine unendliche Anzahl potenzieller doppelter Verweise auf eine einzelne Ressource erzeugt (was, wenn es nicht gegen den Buchstaben einer Spezifikation verstößt, sicherlich den Geist verletzt) ​​und praktischer (2) In Browsern, in denen die leere Zeichenfolge ordnungsgemäß a//bals Verzeichnis gezählt wird, wird die Behandlung relativer Pfade "unterbrochen" (siehe das obige Stylesheet-Beispiel).
Josh3736

1
... und auf jeden Fall würde ich argumentieren, dass RFC 2396 einem Server die Rückgabe derselben Ressource durch automatisches Ausblenden von Schrägstrichen verbietet, da die Spezifikation besagt, dass jeder Schrägstrich signifikant ist. Das automatische Ignorieren aufeinanderfolgender Schrägstriche verstößt gegen diese Spezifikation. (Es ist eine Sache, wenn jemand seinen Server so programmiert, auch wenn dies albern wäre. Server, die dies standardmäßig tun, sind jedoch nicht korrekt.)
Josh3736

4

Der doppelte Schrägstrich hat eine Bedeutung, wenn er in Ressourcen-URLs verwendet wird. Wenn es sich beispielsweise in CSS um einen Benutzer für eine URL eines Hintergrundbilds handelt:

.classname {
    background : url("//example.com/a/b/c/d.png");
}

Hier bedeutet dies, dass dieses Hintergrundbild von einer anderen Domain als der Domain der vorliegenden Webseite abgerufen wird. Oder mit anderen Worten, http://kann so geschrieben werden, //als würde man das in Ressourcen-URLs verwenden.

Dieser doppelte Schrägstrich zwischen den URLs (zB:) /a//b/c/d.htmhat jedoch keine Bedeutung.


Nun, das ist nicht die ganze Wahrheit. Der doppelte Schrägstrich wird angezeigt, wenn ein Problem mit gemischtem Inhalt vermieden werden muss. Wenn die Site von http geladen wird, wird der doppelte Schrägstrich auf http erweitert. Wenn die Site von https geladen wird, wird der doppelte Schrägstrich auf https erweitert.
Andrej

2

Wie bereits erwähnt, sind einige Server so eingerichtet, dass sie einen doppelten Schrägstrich im URL-Pfad ignorieren, das statische Hosting von Amazon S3 jedoch nicht. Wenn Sie sie in diesem Fall behandeln / ignorieren möchten, können Sie die Umleitungsregeln im Eigenschaftenfenster verwenden.

Wenn Sie nach dem Domainnamen einen doppelten Schrägstrich ignorieren möchten, können Sie Folgendes verwenden:

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

Sie können sie wahrscheinlich auch überall finden und ersetzen, aber das hat mir gereicht.

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.