Risposte:
Questo è un errore nel codice dei programmatori / sviluppatori. Se confronti questi due URL:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
Sembrano diversi ma se dovessi visitarli, entrambi funzionerebbero con la maggior parte dei browser moderni.
Questo è qualcosa che vuoi riparare. Se hai la doppia barra, potresti confondere i crawler web di Google e farli pensare che ci siano 2 versioni della pagina.
Come menzionato da @RandomBen , la doppia barra è probabilmente il risultato di un errore da qualche parte.
Il fatto che la pagina venga caricata non ha nulla a che fare con il browser , ma piuttosto che il server ignora la barra aggiuntiva. Il browser non fa nulla di speciale con barre extra nell'URL, ma le invia semplicemente nella richiesta:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
Sembra che le versioni attuali di Apache e IIS ignorino entrambe le barre extra mentre risolvono il percorso e restituiscono il documento che sarebbe stato restituito se l'URL non avesse barre extra. Tuttavia , i browser (ho testato IE 8 e Chrome 9) vengono confusi da qualsiasi URL relativo (contenente componenti del percorso principale) delle risorse nella pagina, il che produce risultati negativi. Ad esempio, se una pagina ha:
<link rel="stylesheet" href="../../style.css" type="text/css" />
Al caricamento della pagina /a/b/c/
, il browser richiederà /a/style.css
. Ma se, per qualsiasi motivo, /a/b//c/
viene richiesto (e il server ignora la barra aggiuntiva), il browser finirà per richiedere /a/b/style.css
, che non esisterà. Spiacenti, la pagina sembra brutta.
(Ciò ovviamente non accadrà se l'URL non ha un componente del percorso principale ( ..
) o è assoluto.)
E 'mia opinione che Apache e IIS (e probabilmente altri) agiscono in modo non corretto come /a/b/c/
e /a/b//c/
tecnicamente rappresentano due risorse diverse. Secondo RFC 2396 , ogni barra è significativa:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
Quindi, è /a/b/c/
composto da tre segmenti: "a", "b" e "c"; /a/b//c/
in realtà è costituito da quattro: "a", "b", "" (la stringa vuota) e "c". Il fatto che la stringa vuota sia o meno una directory del filesystem valida è un dettaglio della piattaforma del server. (E logicamente, questo significa che il browser è in realtà che operano correttamente quando analizza gli URL relativi a componenti dei percorsi principali - nel mio esempio, salgono oltre la directory "c" e la "" directory, lasciandoci alla richiesta style.css
da "b".)
Se stai usando Apache con mod_rewrite
, c'è una soluzione piuttosto semplice :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Questo genererà un 301 Moved Permanently
reindirizzamento HTTP in modo che eventuali doppie barre vengano rimosse dall'URL.
mod_rewrite
soluzione tenga conto anche delle barre 3, 4, ...? Qualcosa del genere /{2,}
? (Supponendo che Apache consenta quel tipo di quantificatore, non ne ho troppa familiarità)
a/b
e in a//b
effetti sono due percorsi URL distinti, ma nulla impedisce al server di restituire la stessa risorsa per entrambi se lo desidera. Sono d'accordo con te, tuttavia, che in pratica restituire un reindirizzamento 301 sembrerebbe più utile.
a//b
come una directory (vedere l'esempio del foglio di stile sopra).
La doppia barra ha un significato quando viene utilizzata negli URL delle risorse. Ad esempio, quando è utente nel CSS per un URL di un'immagine di sfondo:
.classname {
background : url("//example.com/a/b/c/d.png");
}
Qui significa che questa immagine di sfondo viene recuperata da un dominio diverso da quello della pagina Web corrente. O in altre parole, http://
può essere scritto come //
quando lo si utilizza negli URL delle risorse.
Ma questa doppia barra tra l'URL (ad esempio /a//b/c/d.htm
:) non ha alcun significato.
Come accennato, alcuni server sono configurati per ignorare una doppia barra nel percorso URL, ma l'hosting statico Amazon S3 no. Se si desidera gestirli / ignorarli in quel caso, è possibile utilizzare le Regole di reindirizzamento nel pannello delle proprietà.
Se vuoi ignorare una doppia barra che segue il nome del dominio, puoi usare qualcosa del genere:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
Probabilmente puoi anche trovarli e sostituirli ovunque, ma per me è stato abbastanza.