Que signifie la double barre oblique dans les URL?

32

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/

S'il vous plaît noter que je ne me réfère pas au début juste après http:.

aneuryzm
la source

Réponses:

32

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.

Ben Hoffman
la source
11
En fait, le chargement de la page n’a rien à voir avec le navigateur , mais plutôt que le serveur ignore la barre oblique supplémentaire. Cela a pris du temps, alors voyez la réponse que j'ai postée.
Josh3736
33

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 d'IIS ignorent les barres obliques supplémentaires lors de la résolution du chemin d'accès et renvoient le document qui aurait été renvoyé si l'URL ne comportait pas de barres obliques supplémentaires. Cependant , les navigateurs (j'ai testé IE 8 et Chrome 9) sont perturbés par les URL relatives (contenant les composants de chemin d'accès parent) des ressources de la page, ce qui produit des résultats erronés. 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 supplémentaire), le navigateur finira par demander /a/b/style.css, ce 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.)

Il est de mon avis que Apache et IIS (et probablement d' autres) agissent à tort comme /a/b/c/et /a/b//c/représentent techniquement deux ressources différentes. Selon la RFC 2396 , chaque barre oblique est significative:

  path          = [ abs_path | opaque_part ]

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

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

Donc, se /a/b/c/compose de trois segments: "a", "b" et "c"; /a/b//c/se compose en fait de 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 correctement lors de l'analyse syntaxique d'URL relatives avec des composants de chemin d'accès parent - dans mon exemple, ils dépassent le répertoire "c" et le répertoire "", nous laissant la possibilité de demander style.cssà "b".)

Si vous utilisez Apache avec mod_rewrite, il existe une solution simple :

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

Cela générera une 301 Moved Permanentlyredirection HTTP afin que toutes les doubles barres obliques soient supprimées de l'URL.

josh3736
la source
2
Ne serait-il pas préférable que votre mod_rewritesolution tienne compte des barres 3, 4, ... et des barres obliques? Quelque chose dans le genre de /{2,}? (En supposant qu'Apache permette ce type de quantificateur, je ne le connais pas trop bien)
Ward Muylaert
+1 - Merci pour l'info supplémentaire. Je n'y pensais pas de cette façon!
Ben Hoffman le
3
Ce n'est pas un comportement incorrect : a/bil a//bexiste effectivement deux chemins d'URL distincts, mais rien n'empêche le serveur de renvoyer la même ressource pour les deux s'ils le souhaitent. Je conviens toutefois avec vous que, dans la pratique, renvoyer une redirection 301 semble plus utile.
Ilmari Karonen
4
@IlmariKaronen: C'est absolument un comportement incorrect car (1) ce comportement crée automatiquement un nombre infini de références dupliquées potentielles à une ressource unique (qui, si elle n'est pas contraire à la lettre d'une spécification, viole certainement l'esprit), et plus concrètement (2) il "rompt" la gestion du chemin relatif dans les navigateurs qui comptabilisent correctement la chaîne vide dans a//bun répertoire (voir l'exemple de la feuille de style ci-dessus).
josh3736
1
... et de toute façon, je dirais que la RFC 2396 n'interdit un serveur de retourner la même ressource par des barres obliques-effondrement automatique car la spécification dit que chaque barre oblique est importante. Ignorer automatiquement les barres consécutives est en violation de cette spécification. (C'est une chose si quelqu'un programme son serveur pour faire cela, même si ce serait ridicule. Cependant, le faire par défaut est incorrect.)
josh3736
4

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 de celui de la page Web actuelle. Ou en d'autres termes, http://peut être écrit comme //si vous l'utilisiez dans les URL de ressources.

Mais cette double barre oblique entre les URL (par exemple /a//b/c/d.htm:) n'a aucune signification.

Alan Joseph
la source
Eh bien, ce n'est pas toute la vérité. La double barre oblique est supprimée lorsqu'il est nécessaire d'éviter les problèmes de contenu mixte. Ainsi, lorsque le site est chargé à partir de http, la doublelash est étendue à http.
Andrej
2

Comme indiqué précédemment, certains serveurs sont configurés pour ignorer une double barre oblique dans le chemin de l'URL, contrairement à l'hébergement statique Amazon S3. Si vous souhaitez les gérer / les ignorer dans ce cas, vous pouvez utiliser les 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.

orlade
la source