Che cosa significa la doppia barra negli URL?


32

Che cosa significano esattamente le doppie barre trovate negli URL?

Per esempio:

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

Si noti che non mi riferisco all'inizio subito dopo http:.

Risposte:


32

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.


11
In realtà, il caricamento della pagina non ha nulla a che fare con il browser , ma piuttosto che il server ignora la barra aggiuntiva. Ci è voluto molto, quindi vedi la risposta che ho pubblicato.
josh3736,

33

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.cssda "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 Permanentlyreindirizzamento HTTP in modo che eventuali doppie barre vengano rimosse dall'URL.


2
Non sarebbe meglio che la tua mod_rewritesoluzione tenga conto anche delle barre 3, 4, ...? Qualcosa del genere /{2,}? (Supponendo che Apache consenta quel tipo di quantificatore, non ne ho troppa familiarità)
Ward Muylaert,

+1 - Grazie per le informazioni extra. Non ci ho pensato in quel modo!
Ben Hoffman,

3
Non è un comportamento errato : a/be in a//beffetti 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.
Ilmari Karonen,

4
@IlmariKaronen: è assolutamente un comportamento errato perché (1) questo comportamento crea automaticamente un numero infinito di potenziali riferimenti duplicati a una singola risorsa (che, se non in violazione della lettera di qualsiasi specifica, certamente viola lo spirito), e più praticamente (2) "interrompe" la gestione del percorso relativo nei browser che contano correttamente la stringa vuota a//bcome una directory (vedere l'esempio del foglio di stile sopra).
josh3736,

1
... e comunque, direi che RFC 2396 non vietare un server di tornare la stessa risorsa da barre di auto-collasso, perché le specifiche dice ogni barra è significativo. Ignorare automaticamente le barre consecutive è una violazione di tale specifica. (È una cosa se qualcuno programmasse il proprio server per farlo, anche se farlo sarebbe sciocco. Tuttavia, i server che lo fanno per impostazione predefinita non sono corretti.)
josh3736

4

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.


bene, questa non è tutta la verità. La doppia barra viene visualizzata quando è necessario evitare problemi di contenuto misto, quindi quando il sito viene caricato da http il doppio viene espanso in http, quando il sito viene caricato da https il doppio viene espanso in https.
Andrej

2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.