web-dev-qa-db-fra.com

La ponctuation à l'intérieur d'une chaîne de requête peut-elle être valide?

Je travaille toujours sur un module Apache pour lutter contre la capacité de Google à trouver du contenu en double sur mon site Web, et les barres obliques jettent apparemment Apache.

Ma question est la suivante. La ponctuation est-elle parfaitement acceptable au milieu d'une chaîne de requête?

Par exemple, l'une des URL suivantes serait-elle parfaitement valide?

http://example.com/?/$=dollar
http://example.com/?/=slash
http://example.com/??=questionmark
http://example.com/?//=twoslashes

Ou dois-je les convertir en URL de ce type avant de les demander, puis de les décoder d'abord avec le script de réception?

http://example.com/?%3F=questionmark
http://example.com/?%2F%2F=twoslashes
http://example.com/?%2F=slash

J'utilise CURL pour effectuer toutes mes demandes d'URL.

1
Mike

La ponctuation est-elle parfaitement acceptable au milieu d'une chaîne de requête?

Oui, mais cela dépend de la ponctuation.

RFC 3986 section 3.4 définit les caractères autorisés dans la partie chaîne de requête de l'URL:

      query = *( pchar / "/" / "?" )
      pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
 unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
 sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
      ALPHA = (letters)
      DIGIT = (decimal digits)

L'ajout de tous ces éléments nous donne les caractères suivants pouvant être utilisés non encodés:

A-Z, a-z, 0-9, -, ., _, ~, !, $, &, ', (, ), *, +, ,, ;, =, :, @, /, ?

Tous les autres caractères doivent être codés en pourcentage.

Cependant, quelques-uns de ces caractères ont une signification particulière dans la partie chaîne de requête de l'URL. Notamment &, + (espace codé), ; (alt to &) et =. Donc, si vous avez besoin d’en inclure un littéral, il doit aussi être encodé en pourcentage.

Alors, en regardant votre exemple:

http://example.com/?/$=dollar
http://example.com/?/=slash
http://example.com/??=questionmark
http://example.com/?//=twoslashes

Toutes ces URL sont valables telles quelles (non codées).

3
MrWhite