web-dev-qa-db-fra.com

Sitemap.xml génère 404 pour les URL avec guillemets simples et virgules

Je vais essayer de garder cela aussi concis que possible: lorsqu'il s'agit de guillemets simples et de virgules dans l'URL, je me damne si j'encode, et damné si je ne le fais pas.

Si je laisse la citation unique non codée dans l'entrée sitemap.xml loc, certains robots d'exploration (notamment Bing) tronquent l'URL jusqu'au point situé juste avant la citation unique.

Si je code la citation unique comme suit: ' selon ce guide , des robots explorent l’URL jusqu’à l'esperluette incluse. Bing avait l'habitude de faire cela jusqu'à ce que je contacte son support technique.

Cependant, maintenant que mon sitemap.xml est "approprié" selon le guide, Google Webmaster affiche une tonne de 404 - dont la plupart montrent que le robot d'exploration de Google utilise la forme encodée XML de l'URL (par exemple, http://example.com/someone'-lucky-day) au lieu de la forme décodée (http://example.com/someone's-lucky-day). Les 404 autres URL contiennent des virgules (par exemple, http://example.com/someone,-really-hates-me devient http://example.com/someone).

Une chose à noter: chaque fois que mon application Web génère une erreur de serveur 500, je reçois une copie de l'erreur par courrier électronique. L'e-mail inclut l'URL tentée par le visiteur (ou le robot d'exploration dans ce cas). Après avoir changé mon sitemap.xml pour coder les guillemets simples, je n’ai plus reçu ces rapports d’erreur; pour l'instant, c'est Google Webmaster qui se plaint.

2
JakeTheSnake

Le codage HTML dans les pages ne peut pas être utilisé dans le cadre d'une URL.

Vous devez utiliser un codage spécial des caractères pour les symboles susceptibles de détruire l’URL.

Pour l’encodage, vous commencez le caractère avec un signe de pourcentage, puis un code hexadécimal qui, je pense, signifie le code ascii du caractère que vous essayez d’utiliser.

Allez à cette page et utilisez les formulaires et remplissez vos URL en question pour voir comment elles devraient être encodées.

http://www.w3schools.com/tags/ref_urlencode.asp

1
Mike

FWIW ... à première vue, Google semblerait être incorrect, à mon avis. Ou plutôt, c'est la mise en œuvre de la norme (RFC 3986) est trop stricte. (Bien que les systèmes varient à cet égard.)

Les URL doivent toujours être convenablement codées par des URL/ codées en pourcentage (comme indiqué par @mike) en codant des caractères ayant une signification spéciale, puis une entité XML codée lorsqu'elle est utilisée dans un document XML (ou une entité HTML codée si utilisé dans un document HTML).

Bien que les guillemets simples et les virgules soient considérés comme " caractères réservés " dans une URL, ils n'ont aucune signification particulière dans la partie chemin de l'URL et peuvent être utilisés tels quels, sans étant codé en pourcentage. Ainsi, une URL telle que http://example.com/someone's-lucky-day est parfaitement valide en tant que telle - le ' n'a pas besoin d'être pour être encodé ici (il devrait quand même l'être XML encodé dans un sitemp XML). Juste pour clarifier, il n'y a aucun mal à coder pour cent ces caractères, en fait, vous pouvez coder pour cent tout si vous le vouliez!

Référence: StackOverflow quesion - Caractères valides pour la partie Répertoire d'une URL .

La méthode JavaScript encodeURI() (pour le codage des parties du chemin d'une URL) n'entre pas en conflit avec l'implémentation de Google. caractères de citation et virgule. Cependant, la fonction PHP correspondante rawurlencode() le fait. En examinant le résultat de ces fonctions, il semble que JavaScript suive de près le standard; PHP pas.

Cependant, une autre pensée ... Existe-t-il un problème d'encodage? Le document XML UTF-8 est-il codé et ces caractères sont-ils vraiment des apostrophes et des virgules et non des guillemets bouclés ou quelque chose qui "ressemble"-t-il?!

1
MrWhite