2010-06-20 5 views
1

J'ai de la difficulté à comprendre les spécifications et les directives sur la manière d'échapper et d'encoder correctement une URL pour la soumission dans un sitemap.Plan du site Encoder les malheurs

Dans les sitemap.org (entité qui s'échappent) des exemples, ils ont un exemple URL:

http://www.example.com/ümlat.php&q=name 

qui, lorsqu'il termine encodée UTF-8 comme (selon eux):

http://www.example.com/%C3%BCmlat.php&q=name 

Cependant, quand j'essaie ceci (rawurlencode) sur PHP je me retrouve avec:

http%3A%2F%2Fwww.example.com%2F%C3%BCmlat.php%26q%3Dname 

J'ai un peu battu cela en utilisant cette fonction trouvée sur PHP.net

$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', 
    '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%23', '%5B', '%5D'); 

$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", 
    "$", ",", "/", "?", "#", "[", "]"); 

$string = str_replace($entities, $replacements, rawurlencode($string)); 

mais selon quelqu'un que je parlais (Kohana BDFM), cette interprétation est erronée. Honnêtement, je suis si confus que je ne sais même pas ce qui est juste.

Quelle est la bonne façon d'encoder une URL à utiliser dans le sitemap?

pertinentes RFC 3986

Répondre

3

Le problème est que http://www.example.com/ümlat.php&q=name n'est pas une URL valide.

(source: RFC 1738, qui est obsolète, mais sert son but ici, RFC 3986 permet en effet plus de caractères, mais pas de mal est fait en échappant à des personnages qui ne ont pas besoin échapper)

 
httpurl  = "http://" hostport [ "/" hpath [ "?" search ]] 
hpath   = hsegment *[ "/" hsegment ] 
hsegment  = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 
uchar   = unreserved | escape 
unreserved  = alpha | digit | safe | extra 
safe   = "$" | "-" | "_" | "." | "+" 
extra   = "!" | "*" | "'" | "(" | ")" | "," 
escape   = "%" hex hex 
search   = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 

donc un caractère excepté ;:@&=$-_.+!*'(),, un caractère 0-9a-zA-Z ou une séquence d'échappement (par exemple %A0 ou, de manière équivalente, %a0) doit être échappé. Le caractère ? peut apparaître au plus une fois. Le caractère / peut apparaître dans la partie chemin, mais pas dans la chaîne de requête. La convention pour coder les autres caractères est de calculer leur représentation UTF-8 et d'échapper à cette séquence.

Votre algorithme devrait (en supposant que la partie hôte est pas un problème ...):

  • extrait la partie de chemin
  • extraire la partie de chaîne de requête
  • pour chacun de ceux-ci, chercher invalides caractères
  • coder les caractères UTF-8
  • passer le résultat à rawurlencode
  • remplacer le caractère l'URL avec le résultat de rawurlencode
+0

Parfait, merci pour l'explication détaillée. –