Respuestas:
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.
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.css
desde "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 Permanently
redirección HTTP para que cualquier barra doble se elimine de la URL.
mod_rewrite
solució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)
a/b
y a//b
de 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.
a//b
como un directorio (consulte el ejemplo de la hoja de estilo anterior).
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.
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í.