url avec plusieurs barres obliques, ne rien casser?
http://example.com/something/somewhere//somehow/script.js
La double barre oblique casser quoi que ce soit sur le serveur? J'ai un script qui analyse les Url et je me demandais si elle allait se briser quoi que ce soit (ou de modifier le chemin d'accès) si j'ai remplacé plusieurs obliques à un seul. Surtout du côté du serveur, certains cadres comme CodeIgniter et Joomla utilisation sectorielle schémas d'url et de routage. Je veux juste savoir si ça casse quoi que ce soit.
Vous devez vous connecter pour publier un commentaire.
HTTP La RFC 2396 définit le séparateur de chemin à seule barre oblique.
Cependant, sauf si vous êtes en utilisant un certain type de réécriture d'URL (dans ce cas, les règles de réécriture peut être affectée par le nombre de barres obliques), les uri correspond à un chemin d'accès sur le disque, mais dans (la plupart?) moderne des systèmes d'exploitation (Linux/Unix, Windows), plusieurs séparateurs de chemin dans une ligne n'a pas de signification particulière, de sorte que /chemin/vers/foo et /chemin//à//////foo serait finalement la carte pour le même fichier.
Une chose supplémentaire qui pourrait être concernée est mise en cache. Depuis deux votre navigateur et le serveur de cache des pages individuelles (en fonction de leurs paramètres de mise en cache), demandant même fichier plusieurs fois par légèrement différents Uri pourrait affecter la mise en cache (en fonction sur le serveur et le client de la mise en œuvre).
path_segments
comprend au moins unsegment
jeton, qui lui-même peut être de vide de longueur. Cela signifie que les séquences de caractères comme//
sont parfaitement valables en Uri.http://host/a/b/c/d + ../../e = http://host/a/e
, tandis quehttp://host/a/b/c//d + ../../e = http://host/a/b/e
Url n'avez pas de carte de système de fichiers chemins. Donc, même si //dans un chemin du système de fichiers est équivalent à /, vous ne pouvez pas garantir le même est vrai pour toutes les URLs.
La bonne réponse à cette question est , il dépend de la mise en œuvre du serveur!
Préface: la Double barre oblique est syntaxiquement valide conformément à la RFC 2396, qui définit le chemin d'accès d'URL de la syntaxe. Comme amn explique qu'il implique donc un vide URI segment. Notez cependant que la RFC 2396 définit seulement le syntaxe, pas la sémantique de chemins, vides compris les segments du chemin, il est donc à votre serveur pour décider de la sémantique du vide chemin.
Vous n'avez pas mentionné le logiciel de serveur de la pile que vous utilisez, vous êtes peut-être même de roulement de votre propre? Alors utilisez votre imagination quant à ce que la sémantique pourrait être!
Pratiquement, je tiens à souligner un peu tous les jours sémantique des raisons liées à la ce qui signifie que vous devez éviter les doubles barres obliques, même si elles sont syntaxiquement valide:
Depuis vide valide est en quelque sorte pas attendu par tout le monde, il peut causer des bugs. Et même si votre serveur de la technologie d'aujourd'hui peut être compatible avec elle, soit votre serveur de la technologie de demain ou de la prochaine version de votre serveur de la technologie d'aujourd'hui peut décider de ne pas le supportent plus. Exemple: ASP.NET MVC, Web API de la bibliothèque renvoie une erreur lorsque vous essayez de spécifier un template de route avec une double barre oblique.
Certains serveurs peuvent l'interpréter //en indiquant le chemin d'accès racine. Cela peut être soit à usage, ou d'un bug - et alors c'est un bug de sécurité, c'est à dire une traversée de répertoire de la vulnérabilité.
Car c'est parfois un bug, et d'un bogue de sécurité, quelques petits malins serveur piles et les pare-feu, voir la sous-chaîne '//', en déduire que vous êtes peut-être faire une tentative à d'exploitation d'un bug, et, par conséquent, ils seront de retour
403 Forbidden
ou400 Bad Request
etc, et de refuser de le faire réellement tout autre traitement de l'URI.De considérer la déclaration de la
path-absolute
non-terminal dans "RFC3986: Identificateur de Ressource Uniforme (URI): Syntaxe Générique" (spécifié, comme cela est habituel, dans ABNF syntaxe):Alors compte de la
segment
déclaration quelques lignes plus bas dans le même document:Si vous pouvez lire ABNF, l'astérisque (
*
) spécifie que l'élément suivantpchar
peut être répétée plusieurs fois pour faire unsegment
, y compris zéro fois. L'apprentissage de cette et re-lecture de lapath-absolute
déclaration ci-dessus, vous pouvez voir que potentiellement videsegment
imples que la deuxième"/"
peut répéter indéfiniment, et donc d'avoir des combinaisons valides comme//////
(longueur arbitraire d'au moins un/
) dans le cadre depath-absolute
(qui lui-même est utilisé dans la spécification de la règle décrivant une URI).Comme toutes les Url sont des Uri, nous pouvons conclure que oui, les Url sont autorisés multiples consécutifs obliques, cité par la RFC.
Mais ce n'est pas comme tout le monde les suit ou met en œuvre URI analyseurs par la spécification, donc je suis assez sûr qu'il y a non-conforme URI/URL analyseurs et tous les types de logiciels que les piles sur le dessus de ces où un tel angle cas de rupture des systèmes plus grands.
http://host/a////b
est une URI valide, mais ce n'est pas ce que l'OP a demandé. Le fait quehttp://host/a////b
est valable de ne pas la rendre équivalente àhttp://host/a/b
. En fait, le RFC que vous citez dit qu'ils ne sont pas équivalent.Une chose que vous pourriez envisager est qu'il pourrait affecter votre page d'indexation dans les moteurs de recherche. Selon cette page web,
L'exemple qu'ils utilisent est:
Je n'ai pas confirmé l'existence de ce serait également vrai si vous avez utilisé
example.com///
, mais je serais certainement envie de savoir si l'optimisation SEO est essentiel pour mon site web.Ils mentionnent que "C'est parce que Google pense qu'il a frappé une URL piège." Si quelqu'un connait la réponse, merci d'ajouter un commentaire à cette réponse; sinon, j'ai pensé qu'il pertinent d'inclure cette affaire à l'examen.
Oui, il peut très certainement casser des choses.
La spec considère
http://host/pages/foo.html
ethttp://host/pages//foo.html
être différents Uri, et les serveurs sont libres d'attribuer des significations différentes pour eux. Cependant, la plupart des serveurs traiter des chemins/pages/foo.html
et/pages//foo.html
à l'identique (parce que le sous-jacent système de fichiers n'est de trop). Mais même lorsque l'on traite avec les serveurs, il est facilement possible pour plus de slash à casser des choses. Considérons une situation où un URI relatif est renvoyé par le serveur.Laissez-moi vous expliquer ce que cela signifie. Dire votre serveur renvoie un document HTML qui contient les éléments suivants:
Si votre navigateur a obtenu que la page à l'aide de
votre navigateur va essayer de charger
Toutefois, si votre navigateur a obtenu que la page à l'aide de
vous aurez probablement la même page (parce que le serveur n'a probablement pas de différence
/pages//foo.html
de/pages/foo.html
), mais votre navigateur à tort d'essayer de chargerVous pourriez être surpris par exemple lors de la construction de liens pour les ressources de votre application.
ne permettra pas de résoudre à
mysite.com/resources/angular/script.js
mais àmysite.com/resources/jquery/angular/script.js
ce que vous n'avez probablement pas envieDoubles barres obliques sont le mal, essayez de les éviter.
Votre question est "est-il casser quelque chose". En termes de l'URL de la spécification, en sus des barres obliques sont autorisés. Ne pas lire les RFC, ici, c'est une expérience rapide, vous pouvez essayer de voir si votre navigateur silencieusement mangles l'URL:
J'ai testé macOS 10.14 (18A391) avec Safari 12.0 (14606.1.36.1.9) et Chrome 69.0.3497.100 et à la fois obtenir le résultat:
Ce qui indiquait que l'utilisation d'un supplément de slash est visible à l'application web.
Certains cas d'utilisation seront brisés lors de l'utilisation d'une double barre oblique. Cela inclut les redirections d'URL/routage qui s'attendent à recevoir un seul encolures URL ou d'autres applications CGI qui sont l'analyse de l'URI directement.
Mais pour les cas normaux de servir du contenu statique, comme votre exemple, ce sera toujours obtenir le bon contenu. Mais le client devra obtenir un cache miss contre le même contenu accessible avec différentes barres obliques.
..
dans votre exemple.../xyz
contrehttp://url/a//b
pour obtenirhttp://url/a/xyz
n'était pas le comportement voulu?http://url/a//b
est l'URL attendu, puis en ajoutant des barres obliques (par exemplehttp://url/a///b
) ou leur suppression (par exemple,http://url/a/b
) pourrait casser des chosess|/+|/|g
). Il est probable que votre serveur va servir le même fichier. Vous êtes responsable de l'effet sur les Url relatives.s|/+|/|g
). Il est probable que votre serveur va servir les différents fichiers dans le cadre de chargement du document référencé (parce qu'il sera probablement charger la page de droite, mais de briser les url relatives à l'intérieur), donc la rupture des choses.