OK pour ignorer la barre oblique avant la chaîne de requête?

Est-il sûr de toujours ignorer la barre oblique de fin lors de l’ajout d’une chaîne de requête?

C’est-à-dire, puis-je utiliser

http://example.com?queryssortingng 

au lieu de:

 http://example.com/?queryssortingng 

? Tous les hébergeurs Web que j’ai utilisés supportent cela, mais est-il sûr de supposer que tous les environnements de serveurs supporteront cette méthode? Est-ce standard?

Non, il n’est pas correct de sauter la barre oblique. Cela peut fonctionner avec les navigateurs modernes, mais cela ne le corrige pas.

Voir RFC1738 – URL et RFC2396 – URI .

Le format selon RFC1738 (j’ai exclu le format de schéma ici):

// : @ : /

Et il continue en notant que:

… le “/” entre l’hôte (ou le port) et le chemin url ne fait PAS partie du chemin url.

Dans ce cas le “?” fait partie du chemin URL qui

… dépend du schéma utilisé, ainsi que de la manière dont il est interprété.

Notez également que, par spécification, il est parfaitement correct d’ omettre “/ url-path” – notez que le “/” a été explicitement inclus dans ce cas.

Ainsi, “foo.com?bar” n’est pas valide car il n’y a pas de “/” avant le chemin URL.

En termes de spécifications modernes, oui , il est permis de sauter la barre oblique, contrairement à ce que prétend la réponse acceptée ici. Bien que la réponse acceptée cite correctement la RFC 1738 (publiée il y a plus de 20 ans!), Elle prétend à tort que la RFC 2396 (publiée en 1998) nécessite la barre oblique et néglige le fait que la RFC 3986 2005 (encore plusieurs années avant l’écriture de la réponse acceptée) et plus récemment par la norme URL WhatWG , qui permettent à la barre oblique d’être supprimée.

Considérons chacune de ces spécifications, du plus ancien au plus récent:


RFC 1738: Uniform Resource Locators (URL) (publié en 1994)

Implicitement, la barre oblique doit être incluse en spécifiant qu’elle peut être omise si l’URL ne contient ni un chemin ni une chaîne de requête (appelée searchpart , ici). Le Bolding ci-dessous est le mien:

Une URL HTTP prend la forme suivante:

 http://:/? 

et sont décrits dans la section 3.1 . Si: est omis, le port par défaut est 80. Aucun nom d’utilisateur ou mot de passe n’est autorisé. est un sélecteur HTTP et est une chaîne de requête. Le est facultatif, tout comme le et son précédent “?”. Si ni ni sont présents, le “/” peut également être omis.


RFC 2396: Identificateurs de ressources uniformes (URI): syntaxe générique (publiée en 1998; “updates” RFC 1738)

Ici, il est acceptable d’omettre la barre oblique. Cette RFC légalise certaines syntaxes d’URL étranges qui ne comportent pas de double barre oblique après le schéma, mais si nous les ignorons (ce sont celles avec un opaque_part dans le opaque_part de la spécification) et nous trouver qu’un absoluteURI est défini comme ceci …

 absoluteURI = scheme ":" ( hier_part | opaque_part ) 

et qu’un hier_part ressemble à ceci:

 hier_part = ( net_path | abs_path ) [ "?" query ] 

et qu’un net_path ressemble à ceci:

 net_path = "//" authority [ abs_path ] 

abs_path est à son tour défini pour commencer par une barre oblique. Notez que abs_path est facultatif dans la grammaire ci-dessus – cela signifie qu’une URL du scheme://authority?query formulaire scheme://authority?query

La motivation de ce changement est indiquée dans l’annexe G.2. Modifications de RFC 1738 et RFC 1808 :

Le point d’interrogation “?” Le caractère a été supprimé de l’ensemble des caractères autorisés pour le userinfo dans le composant authority, car les tests ont montré que de nombreuses applications le traitaient comme réservé à la séparation du composant query du rest de l’URI.

En d’autres termes – le code dans le monde réel supposait que le premier point d’interrogation dans une URL, n’importe où, marquait le début d’une chaîne de requête.


RFC 3986: Uniform Resource Identifier (URI): Syntaxe générique (publiée en 2005; “obsoletes” RFC 2396)

Encore une fois, il est permis d’omettre la barre oblique. La spécification exprime cela en disant qu’un “chemin” est requirejs dans chaque URI contenant une autorité (hôte), et que ce chemin doit commencer par une barre oblique ou ne comporter aucun caractère:

3. Composants de syntaxe

La syntaxe générique de l’URI consiste en une séquence hiérarchique de composants appelée schéma, autorité, chemin, requête et fragment.

 URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty 

Le schéma et les composants du chemin sont requirejs, même si le chemin peut être vide (pas de caractères). Lorsqu’une autorité est présente, le chemin doit être vide ou commencer par une barre oblique (“/”).

Pour être complet, notez que path-abempty est défini plus tard ainsi:

 path-abempty = *( "/" segment ) 

Cela permet en effet de ne pas contenir de caractères.


URL standard par WhatWG (un standard de vie en maintenance active, créé en 2012, dans le but de rendre obsolète le RFC 3986)

Encore une fois, l’omission de la barre oblique est acceptable, bien que cette fois-ci nous n’avons pas de BNF à regarder, mais plutôt de lire beaucoup de prose.

La section 4.3 nous dit:

Une chaîne d’URL absolue doit être l’une des suivantes

  • une chaîne de schéma d’URL qui est une correspondance ASCII insensible à la casse pour un schéma spécial et non une correspondance insensible à la casse ASCII pour ” file “, suivie de ” : ” et d’une chaîne d’URL spéciale relative à un schéma
  • une chaîne de schéma d’URL qui n’est pas une correspondance ASCII insensible à la casse pour un schéma spécial , suivie de “:” et d’une chaîne d’URL relative
  • une chaîne de schéma d’URL qui est une correspondance ASCII insensible à la casse pour “fichier”, suivie de “:” et d’une chaîne URL de fichier relative au schéma

tout facultativement suivi par “?” et une chaîne de requête URL.

Puisque HTTP et HTTPS sont des schémas spéciaux , toute URL HTTP ou HTTPS doit satisfaire à la première de ces trois options, à savoir http: ou https: suivie d’une chaîne de type URL-relative-spéciale , qui:

doit être ” // “, suivi d’une chaîne d’hôte valide , éventuellement suivie de ” : ” et d’une chaîne de port URL , éventuellement suivie d’une chaîne path-absolute-URL .

Une chaîne URL-chemin-absolu est définie pour démarrer avec une barre oblique, mais est explicitement facultative dans la définition d’une chaîne URL absolue ci-dessus; ainsi, il est permis de passer directement de l’hôte à la chaîne ” ? ” et à la chaîne de requête. Les URL telles que http://example.com?query sont donc légales.


Bien sûr, rien de tout cela ne garantit que chaque serveur Web ou bibliothèque HTTP acceptera de telles URL, ni qu’il les traitera comme équivalant sémantiquement à une URL contenant la barre oblique. Mais pour ce qui est des spécifications , sauter la barre est tout à fait légal.

Il n’est pas prudent de supposer cela. Les serveurs Web et les applications Web autonomes inspectent généralement l’URL fournie dans la demande, mais rien ne garantit qu’ils traitent /abc égal à /abc/ . Les serveurs Web et les applications Web autonomes peuvent faire ce qu’ils veulent avec les informations collectées à partir de l’URL, et ce ne sera pas nécessairement ce que vous attendez. Vous devrez savoir quelle est la convention pour l’URL en question.

Notez bien sûr que la plupart des serveurs Web et des frameworks d’applications Web s’efforcent d’accepter toutes sortes d’intrants et de les traiter de manière appropriée. Par conséquent, dans la plupart des cas, le serveur Web ou l’application Web autonome traitera /abc égal à /abc/ . Mais rappelez-vous que, comme le serveur peut faire tout ce qu’il veut avec le chemin, il s’agit simplement d’une observation générique avec de nombreuses exceptions potentielles.

En ajoutant à la réponse acceptée quelques informations supplémentaires, j’ai trouvé après avoir étudié ce problème:

http://tools.ietf.org/html/rfc2396

Le composant autorité est précédé d’une double barre oblique “//” et se termine par la barre oblique suivante “/”, le point d’interrogation “?” Ou à la fin de l’URI. Dans le composant autorité, les caractères “;”, “:”, “@”, “?” Et “/” sont réservés

Sur la base de cette déclaration, le point d’interrogation doit indiquer la fin du composant autorité, avec ou sans barre oblique.

http://tools.ietf.org/html/rfc1738 (balises remplacées)

Le {path} est facultatif, de même que le {searchpart} et son précédent “?”. Si ni {path} ni {searchpart} ne sont présents, le “/” peut également être omis.

Toutefois, cette instruction indique que la barre oblique finale ne peut être omise que si le chemin d’access et searchpart ne sont pas prédéfinis.

Dans le monde réel, j’ai déjà été en mesure de supprimer une barre oblique avant une valeur de requête, mais j’ai récemment constaté qu’une situation était en panne. Si vous avez une requête telle que celle-ci http://my.domain.com?do=something et que vous affichez une page HTML dans Internet Explorer, le lien est corrigé par Internet Explorer. Si vous cliquez ensuite sur Fichier, Envoyer, Page par courrier électronique …, le lien est ajouté à l’e-mail avec un format non valide. Les problèmes varient selon le contenu de la valeur de la requête, mais nous avons pu créer des URL non valides.

En résumé, cela devrait fonctionner, mais tombe en panne.