Antworten:
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.
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.css
von "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 Permanently
Umleitung ausgegeben, sodass doppelte Schrägstriche aus der URL entfernt werden.
mod_rewrite
Lö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)
a/b
und a//b
in 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.
a//b
als Verzeichnis gezählt wird, wird die Behandlung relativer Pfade "unterbrochen" (siehe das obige Stylesheet-Beispiel).
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.htm
hat jedoch keine Bedeutung.
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.