web-dev-qa-db-fra.com

Comment encoder des périodes pour les URL en Javascript?

La publication SO ci-dessous est complète, mais les trois méthodes décrites ne parviennent pas à coder pour les périodes.

Poste: Encoder l'URL en JavaScript?

Par exemple, si j’exécute les trois méthodes (c’est-à-dire, escape, encodeURI, encodeURIComponent), aucune d’elles ne code les périodes.

Ainsi, "food.store" apparaît comme "food.store", qui rompt l'URL. Il casse l'URL car l'application Rails ne peut pas reconnaître l'URL comme étant valide et affiche la page d'erreur 404. Peut-être est-ce une erreur de configuration dans le fichier de routes Rails?

Quel est le meilleur moyen de coder des périodes avec Javascript pour les URL?

37
Crashalot

Les règles ne doivent pas rompre l'URL, mais je ne sais pas comment vous les utilisez, donc je ne peux pas vraiment le dire. Aucune des fonctions que je connais n'encode le '.' pour une url, ce qui signifie que vous devrez utiliser votre propre fonction pour encoder le '.' .

Vous pouvez encoder les données en base64, mais je ne pense pas qu’il existe un moyen natif de le faire en js. Vous pouvez également remplacer toutes les périodes par leur équivalent ASCII (% 2E) côté client et côté serveur.

Fondamentalement, il n'est généralement pas nécessaire de coder ".". Par conséquent, si vous devez le faire, vous devrez créer votre propre solution. Vous voudrez peut-être aussi faire des tests supplémentaires pour vous assurer que le '.' va effectivement casser l'URL.

hth 

29
superultranova

Je sais que c'est un vieux fil de discussion, mais je n'ai vu nulle part ici d'exemples d'URL à l'origine du problème initial. J'ai moi-même rencontré un problème similaire il y a quelques jours avec une application Java. Dans mon cas, la chaîne avec le point était à la fin de l'élément path de l'URL, par exemple.

http://myserver.com/app/servlet/test.string

Dans ce cas, la bibliothèque Spring que j'utilisais ne faisait que me transmettre la partie "test" de cette chaîne au paramètre de méthode annoté correspondant à ma classe de contrôleur, probablement parce qu'elle traitait la ".string" comme une extension de fichier et qu'elle supprimait c'est loin. Peut-être est-ce le même problème sous-jacent au problème original ci-dessus?

Quoi qu'il en soit, j'ai pu contourner ce problème simplement en ajoutant une barre oblique à l'URL. Il suffit de jeter cela au cas où cela serait utile à quelqu'un d'autre.

John

54
John Rix

J'ai eu le même problème où mon .htaccess cassait les valeurs d'entrée avec . Puisque je ne voulais pas changer ce que faisait le .htaccess, j'ai utilisé ceci pour le réparer:

var val="foo.bar";
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E');

cela remplace tout l'encodage standard. avec leur équivalent ascii% 2E. PHP est automatiquement reconverti. dans la valeur $ _REQUEST mais le .htaccess ne le voit pas comme une période, donc tout va bien.

8
Matthew Cornelisse

Les périodes ne doivent pas nécessairement être codées dans les URL. Ici est le RFC à regarder.

Si une période est "en train de" rompre quelque chose, il se peut que votre serveur interprète lui-même l'URL, ce qui est une bonne chose à faire bien sûr, mais cela signifie que vous devez créer votre propre schéma de codage vos propres métacaractères ont besoin de s'échapper.

7
Pointy

J'avais la même question et peut-être que ma solution pourrait aider quelqu'un d'autre à l'avenir. 

Dans mon cas, l'URL a été générée à l'aide de javascript. Les périodes sont utilisées pour séparer les valeurs dans l'URL ( sling selectors ), les sélecteurs eux-mêmes n'étaient donc pas autorisés à avoir des périodes.

Ma solution était de remplacer toutes les périodes par l'entité html telle quelle Figure 1:

Figure 1: Solution

var urlPart = 'foo.bar';
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.'));

console.log(safeUrlPart); // foo%26%2346%3Bbar
console.log(decodeURIComponent(safeUrlPart)); // foo.bar
3
TJ.

Si possible, utiliser un fichier .htaccess le rendrait vraiment cool et facile. Ajoutez juste un\avant la période. Quelque chose comme: \.

1
David Lartey

C’est un problème de Rails, voir Routage de Rails REST: points dans l’ID de l’élément de ressource pour une explication (et le guide de routage de Rails, section 3.2)

0
user1251840

J'ai eu des problèmes avec .s in rest api urls. C'est le fait qu'elles sont interprétées comme des extensions qui, à leur manière, ont du sens. S'échapper n'aide pas, car ils ne sont pas échappés avant l'appel (comme déjà indiqué). Ajouter un trailing/n’a pas aidé non plus. J'ai contourné cela en passant la valeur sous forme d'argument nommé. par exemple. api/Id/Text.string à api/Id? arg = Text.string. Vous aurez besoin de modifier le routage sur le contrôleur, mais le gestionnaire lui-même peut rester le même.

0
user8296471