¿Qué significa la doble barra diagonal en las URL?

32

¿Qué significa exactamente las barras diagonales que se encuentran a menudo en las URL?

Por ejemplo:

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

Tenga en cuenta que no me estoy refiriendo al comienzo justo después http:.

aneuryzm
fuente

Respuestas:

32

Ese es un error en el código de programadores / desarrolladores. Si compara estas dos URL:

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

Se ven diferentes, pero si visitara cualquiera de ellos, ambos funcionarían en la mayoría de los navegadores modernos.

Esto es algo que quieres arreglar. Si tiene la doble barra, podría confundir a los rastreadores web de Google y hacerles pensar que hay 2 versiones de la página.

Ben Hoffman
fuente
11
En realidad, que la página cargue no tiene nada que ver con el navegador , sino que el servidor ignora la barra adicional. Esto se hizo largo, así que mira la respuesta que publiqué.
josh3736
33

Como mencionó @RandomBen , la doble barra es muy probablemente el resultado de un error en alguna parte.

Que la página cargue no tiene nada que ver con el navegador , sino que el servidor ignora la barra adicional. El navegador no hace nada especial con barras adicionales en la URL, solo las envía junto con la solicitud:

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

Parece que las versiones actuales de Apache e IIS ignorarán las barras diagonales adicionales mientras resuelven la ruta y devolverán el documento que se habría devuelto si la URL no hubiera barras diagonales adicionales. Sin embargo , los navegadores (probé IE 8 y Chrome 9) se confunden con cualquier URL relativa (que contenga componentes de ruta principal) de recursos en la página, lo que produce malos resultados. Por ejemplo, si una página tiene:

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

Al cargar la página /a/b/c/, el navegador lo solicitará /a/style.css. Pero si, por cualquier razón, /a/b//c/se solicita (y el servidor ignora la barra adicional), el navegador terminará solicitando /a/b/style.css, lo que no existirá. Vaya, la página se ve fea.

(Obviamente, esto no sucederá si la URL no tiene un componente de ruta principal ( ..) o es absoluta).

Es mi opinión que Apache e IIS (y probablemente otros) están actuando de forma incorrecta como /a/b/c/y /a/b//c/técnicamente representan dos recursos diferentes. Según RFC 2396 , cada barra es significativa:

  path          = [ abs_path | opaque_part ]

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

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

Por lo tanto, /a/b/c/consta de tres segmentos: "a", "b" y "c"; /a/b//c/en realidad consta de cuatro: "a", "b", "" (la cadena vacía) y "c". Si la cadena vacía es un directorio válido del sistema de archivos es un detalle de la plataforma del servidor. (Y lógicamente, esto significa que los navegadores realmente funcionan correctamente al analizar URL relativas con componentes de ruta principal; en mi ejemplo, pasan del directorio "c" y el directorio "", dejándonos solicitar style.cssdesde "b").

Si está utilizando Apache con mod_rewrite, hay una solución bastante simple :

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

Esto emitirá una 301 Moved Permanentlyredirección HTTP para que cualquier barra doble se elimine de la URL.

josh3736
fuente
2
¿No sería mejor que tu mod_rewritesolución tuviera en cuenta 3, 4, ... barras también? Algo en la línea de /{2,}? (Suponiendo que Apache permita ese tipo de cuantificador, no estoy muy familiarizado con él)
Ward Muylaert
+1 - Gracias por la información adicional. ¡No lo pensé así!
Ben Hoffman
3
No es incorrecto comportamiento: a/by a//bde hecho son dos rutas de URL distintas, pero nada prohíbe el servidor de devolver el mismo recurso para los dos si se quiere. Sin embargo, estoy de acuerdo con usted en que, en la práctica, devolver una redirección 301 parecería más útil.
Ilmari Karonen
44
@IlmariKaronen: Es absolutamente un comportamiento incorrecto porque (1) este comportamiento crea automáticamente un número infinito de posibles referencias duplicadas a un solo recurso (que, si no viola la letra de ninguna especificación, ciertamente viola el espíritu), y más prácticamente (2) "interrumpe" el manejo de la ruta relativa en los navegadores que cuentan correctamente la cadena vacía a//bcomo un directorio (consulte el ejemplo de la hoja de estilo anterior).
josh3736
1
... y de todos modos, yo diría que el RFC 2396 hace prohibir a un servidor de devolver el mismo recurso por barras de auto-colapso debido a la especificación dice que cada barra es significativo. Ignorar automáticamente las barras consecutivas es una violación de esa especificación. (Es una cosa si alguien programar su servidor para hacer eso, incluso si al hacerlo sería tonto Sin embargo, los servidores que hacen esto por defecto. Es incorrecta.)
josh3736
4

La doble barra tiene un significado cuando se usa en URL de recursos. Por ejemplo, cuando es usuario en CSS para una URL de una imagen de fondo:

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

Aquí significa que esta imagen de fondo está obteniendo de un dominio diferente que no sea el dominio de la página web actual. O, en otras palabras, http://se puede escribir como //cuando se usa eso en las URL de recursos.

Pero esta doble barra entre las URL (por ejemplo /a//b/c/d.htm:) no tiene ningún significado.

Alan Joseph
fuente
bueno, esto no es toda la verdad. La barra doble se genera cuando se necesita evitar un problema de contenido mixto, por lo tanto, cuando el sitio se carga desde http, la barra doble se expandirá a http, cuando el sitio se cargue desde https, la barra doble se expandirá a https.
andrej
2

Como se mencionó, algunos servidores están configurados para ignorar una barra doble en la ruta de la URL, pero el alojamiento estático de Amazon S3 no lo hará. Si desea manejarlos / ignorarlos en ese caso, puede usar las Reglas de redireccionamiento en el panel de propiedades.

Si desea ignorar una barra doble después del nombre de dominio, puede usar algo como esto:

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

Probablemente también pueda encontrarlos y reemplazarlos, pero eso fue suficiente para mí.

orlade
fuente