Quelqu'un connaît-il la liste complète des caractères qui peuvent être utilisés dans un GET sans être encodés? Pour le moment, j'utilise AZ az et 0-9 ... mais je cherche à découvrir la liste complète.
Je suis également intéressé de savoir s'il existe une spécification publiée pour l'ajout à venir d'URL chinoises et arabes (car cela aura évidemment un impact important sur ma question)
!*'();:@&=+$,/?#[]
ou non réservésA-Za-z0-9_.~-
(ou un caractère de pourcentage%
dans le cadre d'un encodage en pourcentage)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
pour trouver une chaîne d'URL avec des caractères incorrects. Peut-être que c'est aussi utile pour quelqu'un d'autre.Réponses:
À partir de la spécification RFC 1738 :
EDIT: Comme @Jukka K. Korpela le souligne correctement, cette RFC a été mise à jour par RFC 3986 . Cela a élargi et clarifié les caractères valides pour l'hôte, malheureusement ce n'est pas facile à copier et à coller, mais je ferai de mon mieux.
Dans le premier ordre correspondant:
la source
A-Za-z0-9_.-~
caractères non réservés et réservés au début de cette réponse.!*'();:@&=+$,/?#[]
Cela peut faire gagner du temps aux gensreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
dit que ce sont des caractères RFC 3986 non réservés (sec. 2.3) ainsi que des caractères réservés (sec 2.2) s'ils doivent conserver leur signification spéciale. Et aussi un caractère de pourcentage dans le cadre d'un encodage en pourcentage.
la source
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
La liste complète des 66 caractères non réservés se trouve dans la RFC3986, ici: http://tools.ietf.org/html/rfc3986#section-2.3
Il s'agit de n'importe quel caractère de l'ensemble de regex suivant:
la source
{}^\~
et n'estbacktick
pas sûre. Et RFC3986 répertorie \ comme dangereux à cause du système de fichiers. Ce moyen{}^
pourrait également être utilisé.-
ou de le mettre au début ou à la fin de la classe de caractères, car il[.-~]
contient en fait tous les caractères ASCII de 46 à 126.Je l'ai testé en demandant mon site Web (apache) avec tous les caractères disponibles sur mon clavier allemand comme paramètre d'URL:
Celles-ci n'ont pas été encodées:
Non encodé après
urlencode()
:Non encodé après
rawurlencode()
:Remarque: avant PHP 5.3.0
rawurlencode()
encodé à~
cause de la RFC 1738 . Mais cela a été remplacé par RFC 3986, donc son utilisation est sûre maintenant. Mais je ne comprends pas pourquoi par exemple{}
sont encodésrawurlencode()
car ils ne sont pas mentionnés dans la RFC 3986.Un test supplémentaire que j'ai fait concernait la liaison automatique dans les textes de courrier. J'ai testé Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de et yahoo.de et ils ont entièrement lié des URL contenant ces caractères:
Bien sûr, le
?
était également lié, mais seulement s'il était utilisé une fois.Certaines personnes suggèrent maintenant de n'utiliser que le
rawurlencode()
caractères, mais avez-vous déjà entendu dire que quelqu'un avait des problèmes pour ouvrir ces sites Web?Asterisk
http://wayback.archive.org/web/*/http://google.com
Colon
https://en.wikipedia.org/wiki/Wikipedia:A propos
Plus
https://plus.google.com/+google
Au signe, deux points, virgule et point d'exclamation
https: //www.google.com/maps/place/USA/@36.2218457, ...
Pour cette raison, ces caractères devraient être utilisables non codés sans problème. Bien sûr, vous ne devriez pas utiliser à
&;
cause de séquences d'encodage comme&
. La même raison est valable pour%
celle utilisée pour encoder les caractères en général. Et=
comme il attribue une valeur à un nom de paramètre.Enfin, je dirais que c'est correct d'utiliser ces non encodés:
Mais si vous vous attendez à des URL générées de manière aléatoire, vous ne devez pas les utiliser
.!
, car elles marquent la fin d'une phrase et certaines applications de messagerie ne lieront pas automatiquement le dernier caractère de l'URL. Exemple:la source
+
signe en particulier :-DD' ici
la source
Ceux-ci sont répertoriés dans la RFC3986 . Voir l' ABNF collecté pour l'URI pour voir ce qui est autorisé où et l' expression régulière pour l'analyse / validation.
la source
RFC3986 définit deux jeux de caractères que vous pouvez utiliser dans un URI:
Caractères réservés :
:/?#[]@!$&'()*+,;=
Caractères non réservés :
A-Za-z0-9-_.~
la source
Le changement à venir concerne les noms de domaine chinois et arabes et non les URI. Les URI internationalisés sont appelés IRI et sont définis dans la RFC 3987 . Cependant, cela dit, je recommanderais de ne pas le faire vous-même, mais de compter sur une bibliothèque existante et testée car il existe de nombreux choix d'encodage / décodage URI et de ce qui est considéré comme sûr par spécification, par rapport à ce qui est sûr par une utilisation réelle (navigateurs) .
la source
Si vous souhaitez offrir une expérience particulière aux utilisateurs, vous pouvez utiliser
pushState
pour apporter un large éventail de caractères à l'URL du navigateur:la source