2010-10-25 56 views
2

Disons que j'ai l'entrée suivante dans mes Grails URLMappings.groovy:Pourquoi Grails URL params décodage se comportent différemment sur le serveur vs locale

"/actionName/param1"(controller:'myController', action:'myAction') 

Quand j'appelle une URL où param1 comprend + comme un caractère spécial , l'URL est codée correctement à /actionName/my%2Bparam par exemple, à la fois dans mon environnement local et dans mon serveur.

Dans mon environnement local - en utilisant également "prod" comme paramètre d'environnement - ceci est correctement résolu en my+param dans le contrôleur. Cependant dans mon "vrai" environnement de production (instance Amazon Web Service EC2), l'URL est résolue en "mon param" ce qui est faux.

Je n'ai aucune idée de ce que la raison pour cela pourrait être. Les deux environnements utilisent TomCat, et comme indiqué ci-dessus, j'utilise même les paramètres d'environnement prod dans mon environnement local, donc il ne peut y avoir de configuration différente entre le développement et la production.

Est-ce que quelqu'un a une idée où je pourrais creuser plus profondément pour identifier le problème?

Répondre

1

C'est un known bug qui a été introduit dans Groovy 1.3.4 ou quelques versions de build auparavant. Il a été corrigé dans la version actuelle 1.3.5.

cela est correctement résolu à mon + dans le param contrôleur

Non, la résolution attendue est "mon PARAM" (avec un espace).
Comme cela fonctionne sur l'hôte Amazon, vous devez mettre à niveau Grails vers la version 1.3.5, localement.

+1

Désolé, mais c'est pas. La résolution attendue est "my + param" car le code URL est% 2B (pas% 20 ou +). Et j'utilise 1.3.5 qui est également déployé sur le serveur. Donc localement, c'est résolu correctement, et c'est faux sur Amazon. –

+0

Désolé, j'aurais mal interprété "% 2B" comme "% 20". - Pour info, votre symptôme de "% 2B" n'étant pas correctement décodé en "+" a également été un bug en 1.3.4, et corrigé en 1.3.5 (selon mes propres tests). - Vous pouvez utiliser * assert "1.3.5" == grailsApplication.properties.metadata.'app.grails.version '* dans votre contrôleur pour vous assurer que 1.3.5 est utilisé. – robbbert

+1

Merci pour votre commentaire. Cependant, si j'ai raison, lors de la construction d'un fichier war, le contenu est toujours la version Grails utilisée localement. Puisque je suis sûr que j'utilise 1.3.5 localement et que je déploie ce fichier war sur le serveur Amazon, il doit aussi être 1.3.5. –

3

L'instance EC2 exécute-t-elle Apache devant Tomcat? J'ai déjà eu des problèmes avec les paramètres qui ont été décodés deux fois, une fois par Apache, puis encore par Tomcat. De mémoire, je pense que j'ai ajusté la configuration de la directive ProxyPass dans Apache pour le corriger.

EDIT:

J'ai trouvé les instructions suivantes que j'avais laissé avec le code source pour mon application :)

ajouts Apache httpd.conf

AllowEncodedSlashes On 
ProxyTimeout 3600 

Nous avons également mis à jour apache 2.2.12+ pour corriger HEAD> GET réécrire un bogue en utilisant un script shell de démarrage.

J'ai aussi ajouté l'option « nocanon » à la directive ProxyPass pour arrêter le décodage automatique par mod_proxy dans /etc/httpd/conf.d/cluster.conf

Je pense que je devais faire sur le serveur que vous pouvez Ne modifiez pas cela en utilisant l'interface graphique. J'ai aussi une note qui dit que la chaîne de requête est encodée. Peut-être que je devais ajouter un décodage supplémentaire dans mon application pour gérer cela (désolé, je ne me souviens pas à coup sûr!)

démarrage Tomcat Paramètres

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true 

Je pense que c'était d'obtenir tomcat pour gérer correctement les barres obliques

acclamations

Lee

+0

Semble raisonnable ... Je n'ai pas trouvé de discussions utiles sur ce sujet, semble que ce n'est pas un problème commun. Je vais essayer de creuser plus profondément/trouver les paramètres de configuration respectifs. –

+0

J'ai maintenant vérifié quelque chose de différent de% 2B. Quand je mets% 2520 dans l'URL (% 25 est le code pour%), il est correctement résolu en% 20, donc je pense qu'il n'y a pas de double décodage. Sinon,% 20 serait également décodé dans un espace. Mais merci quand même! Je suppose que la quête continue. –

+1

Apache s'exécute-t-il devant Tomcat? Je regarderais toujours les paramètres de http.conf si c'est le cas. '+' est un peu un cas particulier je pense. – leebutts