Qu'est-ce que les doubles barres obliques souvent trouvées dans les URL signifient exactement?
Par exemple:
http://www.example.com/A/B//C/
Veuillez noter que je ne fais pas référence au début juste après http:
.
C'est une erreur dans le code des programmeurs/développeurs. Si vous comparez ces deux URL:
http://www.example.com/A/B/C/
http://www.example.com/A/B//C/
Ils ont l'air différent, mais si vous deviez visiter l'un ou l'autre, les deux fonctionneraient dans la plupart des navigateurs modernes.
C'est quelque chose que vous voulez réparer. Si vous avez la double barre oblique, cela pourrait confondre les robots d'exploration de Google et leur faire croire qu'il existe deux versions de la page.
Comme mentionné par @ RandomBen , la double barre oblique est probablement le résultat d'une erreur quelque part.
Que la page se charge n'a rien à voir avec le navigateur, mais plutôt que le serveur ignore la barre oblique supplémentaire. Le navigateur ne fait rien de spécial avec des barres obliques supplémentaires dans l'URL, il les envoie simplement dans la requête:
GET /A/B//C/D HTTP/1.1
Host: www.example.com
...
Il semble que les versions actuelles d'Apache et de IIS ignorent les barres obliques supplémentaires lors de la résolution du chemin et renvoient le document qui aurait été renvoyé si l'URL n'avait pas eu de barres obliques supplémentaires. Cependant , les navigateurs (j'ai testé IE 8 et Chrome 9) sont déroutés par les URL relatives (contenant composants de chemin parent) des ressources de la page, ce qui produit de mauvais résultats. Par exemple, si une page a:
<link rel="stylesheet" href="../../style.css" type="text/css" />
Lors du chargement de la page /a/b/c/
, le navigateur demandera /a/style.css
. Mais si — pour une raison quelconque — /a/b//c/
est demandé (et le serveur ignore la barre oblique), le navigateur finira par demander /a/b/style.css
, qui n'existera pas. Oups, la page a l'air moche.
(Cela ne se produira évidemment pas si l'URL n'a pas de composant de chemin d'accès parent (..
) ou est absolue.)
À mon avis, Apache et IIS (et probablement d’autres) agissent de manière incorrecte en tant que /a/b/c/
et /a/b//c/
représentent techniquement deux ressources différentes. Selon RFC 2396 , chaque barre oblique est importante:
path = [ abs_path | opaque_part ]
path_segments = segment *( "/" segment )
segment = *pchar *( ";" param )
param = *pchar
pchar = unreserved | escaped |
":" | "@" | "&" | "=" | "+" | "$" | ","
Ainsi, /a/b/c/
comprend trois segments: "a", "b" et "c"; /a/b//c/
comprend en fait quatre: "a", "b", "" (la chaîne vide) et "c". Le fait que la chaîne vide soit ou non un répertoire de système de fichiers valide est un détail de la plate-forme du serveur. (Et logiquement, cela signifie que les navigateurs fonctionnent réellement correctement lors de l'analyse syntaxique d'URL relatives avec des composants de chemin parent - dans mon exemple, ils dépassent le "c "et le répertoire", nous laissant demander style.css
à "b".)
Si vous utilisez Apache avec mod_rewrite
, il existe un joli solution simple :
# remove multiple slashes anywhere in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Cela générera une redirection HTTP 301 Moved Permanently
afin que toutes les doubles barres obliques soient supprimées de l'URL.
La double barre oblique a une signification lorsqu'elle est utilisée dans les URL de ressources. Par exemple, quand il s'agit d'un utilisateur en CSS pour une URL d'une image d'arrière-plan:
.classname {
background : url("//example.com/a/b/c/d.png");
}
Ici, cela signifie que cette image d'arrière-plan est extraite d'un domaine différent du domaine de la page Web actuelle. Ou en d'autres termes, http://
peut être écrit simplement //
lorsque vous l'utilisez dans les URL de ressources.
Mais cette double barre oblique entre les URL (par exemple: /a//b/c/d.htm
) n'a aucune signification.
Comme indiqué précédemment, certains serveurs sont configurés pour ignorer une double barre oblique dans le chemin de l'URL, mais pas l'hébergement statique Amazon S3. Si vous souhaitez les gérer/les ignorer dans ce cas, vous pouvez utiliser Règles de redirection dans le panneau des propriétés.
Si vous voulez ignorer une double barre oblique après le nom de domaine, vous pouvez utiliser quelque chose comme ceci:
<RoutingRules>
<RoutingRule>
<Condition>
<KeyPrefixEquals>/</KeyPrefixEquals>
</Condition>
<Redirect>
<ReplaceKeyPrefixWith/>
</Redirect>
</RoutingRule>
</RoutingRules>
Vous pouvez probablement aussi les trouver et les remplacer, mais cela me suffisait.