Un paramètre de requête d'URL est-il valide s'il n'a aucune valeur?

138

Une URL est-elle http://example.com/foo?barvalide?

Je cherche un lien vers quelque chose d'officiel qui dit d'une manière ou d'une autre. Une simple réponse oui / non ou des preuves anecdotiques ne suffiront pas.

Conley Owens
la source
3
En plus de l'URI RFC, je tiens à souligner un exemple concret de cela. Drupal utilise ces paramètres de requête sans valeur dans certains liens comme une forme de contournement du cache. par exemple www.google-analytics.com/analytics.js?o490ub ou /themes/seven/ie.css?o4eppb. Vous le savez probablement déjà, mais certains trébucher sur cela pourraient ne pas l'être.
Elijah Lynn

Réponses:

103
  • Valide pour l'URI RFC
  • Probablement acceptable pour votre framework / code côté serveur

La RFC URI n'impose pas de format pour la chaîne de requête. Bien qu'il soit reconnu que la chaîne de requête portera souvent des paires nom-valeur, ce n'est pas obligatoire (par exemple, elle contiendra souvent un autre URI).

3.4. Requete

Le composant de requête contient des données non hiérarchiques qui, avec les données du composant de chemin (section 3.3), servent à identifier une ressource dans la portée du schéma de l'URI et de l'autorité de dénomination (le cas échéant). ...

... Cependant, comme les composants de requête sont souvent utilisés pour transporter des informations d'identification sous la forme de paires "clé = valeur" et qu'une valeur fréquemment utilisée est une référence à un autre URI, ...

HTML établit qu'un formulaire soumis via HTTP GET doit encoder les valeurs du formulaire sous la forme de paires nom-valeur sous la forme "? Key1 = value1 & key2 = value2 ..." (correctement encodées). L'analyse de la chaîne de requête dépend du code côté serveur (par exemple, le moteur de servlet Java).

Vous n'identifiez pas quel framework côté serveur vous utilisez, le cas échéant, mais il est possible que votre framework côté serveur puisse supposer que la chaîne de requête sera toujours dans des paires nom-valeur et il peut s'étouffer avec une chaîne de requête qui ne l'est pas dans ce format (par exemple ?bar). S'il s'agit de votre propre code personnalisé analysant la chaîne de requête, vous devez simplement vous assurer de gérer ce format de chaîne de requête. S'il s'agit d'un framework, vous devrez consulter votre documentation ou simplement le tester pour voir comment il est géré.

Bert F
la source
7
ASP.NET MVC (versions 4 et 5 à ma connaissance) s'étouffe définitivement lorsqu'il n'y a aucune valeur fournie :(
AR
2
La isindexmagie namede HTML5 permet d'envoyer une chaîne de requête sans format clé-valeur stackoverflow.com/a/37579004/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 en tant que fonctionnalité obsolète pour le support hérité de HTML3
Evan Carroll
80

Ils sont parfaitement valables. Vous pourriez les considérer comme l'équivalent du grand type musclé se tenant silencieusement derrière le messager de la foule. Le gars n'a pas de nom et ne parle pas, mais sa simple présence transmet des informations.

Marc B
la source
19
Le type musclé du gangster a un nom, vous ne le savez pas. Vous le savez cependant sur le paramètre et il porte essentiellement une valeur booléenne (présente, absente).
Vlasec
2
La meilleure façon de le décrire :)
Mohammad Kermani
1
Le nom du grand gars est Cheich , de cet épisode de braquage de casino sur Star Trek: Deep Space 9.
Anthony Rutledge
8

"Le schéma" http "est utilisé pour localiser les ressources réseau via le protocole HTTP. Cette section définit la syntaxe et la sémantique spécifiques au schéma pour les URL http." http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

Alors oui, tout est valide après un point d'interrogation. Votre serveur peut interpréter différemment, mais de manière anecdotique , vous pouvez voir que certaines langues traitent cela comme une valeur booléenne qui est vraie si elle est répertoriée.

Jeff Ferland
la source
6
Pour la définition formelle, voir RFC 2396 ( ietf.org/rfc/rfc2396.txt ), qui est silencieuse sur le contenu de la chaîne de requête, autre que pour spécifier le jeu de caractères légal et ceux qui ont une signification spéciale. Plus précisément, il dit que le «composant de requête est une chaîne d'informations à interpréter par la ressource», ce qui implique que sa définition dépend du protocole, et donc la clé = valeur est largement par convention.
RobertB
6

Oui, c'est valable.

Si l'on veut simplement vérifier si le paramètre existe ou non, c'est une façon de le faire.

Oded
la source
4

Spécification URI

La seule partie pertinente de la spécification URI est de tout savoir entre le premier ?et le premier qui #correspond à la définition d'une requête de la spécification. Il peut inclure des caractères tels que [:/.?]. Cela signifie qu'une chaîne de requête telle que ?barou ?ten+green+applesest valide.

Trouvez la RFC 3986 ici

Spécification HTML

isindex n'est pas vraiment HTML5.

Il est fourni obsolète pour être utilisé comme premier élément d'un formulaire uniquement et se soumet sans nom.

Si le nom de l'entrée est "isindex", son type est "text", et il s'agit de la première entrée du jeu de données du formulaire, puis ajoutez la valeur au résultat et ignorez le reste des sous-étapes pour cette entrée, en passant à la suivante le cas échéant, ou l'étape suivante de l'algorithme global dans le cas contraire.

L'indicateur isindex est uniquement destiné à un usage hérité. Les formulaires dans les documents HTML conformes ne généreront pas de charges utiles qui doivent être décodées avec cet ensemble d'indicateurs.

La dernière prise en charge d'isindex était HTML3 . Son utilisation en HTML5 est de fournir une compatibilité ascendante plus facile.

Support dans les bibliothèques

La prise en charge dans les bibliothèques de ce format d'URI varie, mais certaines bibliothèques fournissent une prise en charge héritée pour faciliter l'utilisation de isindex.

Perl URI.pm (support spécial)

Certaines bibliothèques comme l'URI de Perl fournissent des méthodes d'analyse de ce type de structures

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(pas de support spécial)

Comme autre exemple beaucoup plus fréquent, node.jsprend la route normale et facilite l'analyse en tant que

  • Un string
  • ou, un objet de clés et de valeurs (en utilisant parseQueryString)

La plupart des autres API d'analyse d'URI suivent quelque chose de similaire.

Evan Carroll
la source
3

isindexmagie obsolète namede HTML5

Cette fonctionnalité obsolète permet à une soumission de formulaire de générer une telle URL, fournissant une preuve supplémentaire qu'elle est valide pour HTML. Par exemple:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

génère une URL de type:

?bar

Standard: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexest cependant obsolète comme mentionné à l' adresse : https://stackoverflow.com/a/41689431/895245

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
1

Comme toutes les autres réponses décrites, il est parfaitement valide pour la vérification, spécialement pour les trucs de type booléen

Voici une fonction simple pour obtenir la chaîne de requête par nom:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

et maintenant vous voulez vérifier si la chaîne de requête que vous recherchez existe ou non, vous pouvez faire une chose simple comme:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

le exampleQueryStringsera falsesi la fonction ne trouve pas la chaîne de requête, sinon le sera true.

Mohammad Kermani
la source