Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么grails URL参数解码在服务器和本地上的行为不同_Url_Grails_Urlencode_Params_Urldecode - Fatal编程技术网

为什么grails URL参数解码在服务器和本地上的行为不同

为什么grails URL参数解码在服务器和本地上的行为不同,url,grails,urlencode,params,urldecode,Url,Grails,Urlencode,Params,Urldecode,假设我在grails URLMappings.groovy中有以下条目: "/actionName/param1"(controller:'myController', action:'myAction') 当我调用一个URL,其中param1包含+作为特殊字符时,该URL被正确编码为/actionName/my%2Bparam,例如,在我的本地和服务器环境中 在我的本地环境中-也使用“prod”作为环境参数-这在控制器中正确解析为my+param。然而,在我的“真实”生产环境(AmazonW

假设我在grails URLMappings.groovy中有以下条目:

"/actionName/param1"(controller:'myController', action:'myAction')
当我调用一个URL,其中
param1
包含
+
作为特殊字符时,该URL被正确编码为
/actionName/my%2Bparam
,例如,在我的本地和服务器环境中

在我的本地环境中-也使用“prod”作为环境参数-这在控制器中正确解析为
my+param
。然而,在我的“真实”生产环境(AmazonWebServiceEC2实例)中,URL被解析为“MyParam”,这是错误的

我不知道这是什么原因。这两种环境都使用TomCat,如上所述,我甚至在本地环境中使用prod环境设置,因此开发和生产之间的配置不会有所不同

有人知道我可以在哪里深入挖掘以确定问题吗?

这是一个在Groovy 1.3.4或之前的几个构建版本中引入的概念。它已在当前版本1.3.5中修复

这已正确解析为my+参数 在控制器中

否,预期分辨率为“my param”(带空格)。

在Amazon主机上运行时,您需要在本地将Grails升级到1.3.5。

EC2实例是否在Tomcat前面运行Apache?我以前遇到过两次params被解码的问题,一次是由Apache解码,另一次是由Tomcat解码。从内存来看,我想我调整了Apache中ProxyPass指令的配置,以纠正它

编辑:

我找到了我留给我的应用程序源代码的以下说明:)

apachehttpd.conf添加

AllowEncodedSlashes On 
ProxyTimeout 3600
我们还升级了Apache2.2.12+,以使用启动shell脚本修复HEAD>GET rewrite错误

我还在ProxyPass指令中添加了'nocanon'选项,以停止mod_proxy在/etc/httpd/conf.d/cluster.conf中的自动解码

我想我必须在服务器上这样做,因为您不能使用GUI修改它。我还有一个注释说这会导致他们对查询字符串进行编码。也许我不得不在我的应用程序中添加一个额外的解码来处理这个问题(对不起,我不记得了!)

Tomcat启动参数

-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
我认为这是为了让tomcat正确处理斜杠

干杯


对不起,不是这样的。由于URL代码为%2B(不是%20或+),因此预期的分辨率为“my+param”。我使用的是1.3.5,它也部署在服务器上。所以在本地它被正确地解决了,在Amazon上它是错误的。对不起,我把“%2B”误读为“%20”。-仅供参考,您的“%2B”未正确解码为“+”的症状在1.3.4中也是一个错误,并在1.3.5中修复(根据我自己的测试)。-您可以在控制器中使用assert“1.3.5”==grailsApplication.properties.metadata.app.grails.version以确保1.3.5正在使用中。谢谢您的评论。但是,如果我是正确的,在构建war文件时,内容始终是本地使用的grails版本。因为我确定我在本地使用1.3.5,并且我在Amazon服务器上部署了这个war文件,所以它也必须是1.3.5。1.3.5或1.3.6中没有固定的版本。我从1.3.4升级到1.3.6是为了处理类似的服务器与本地解码问题,当时我的问题已经解决了。但现在我正面临着一个编码+消失的确切问题。这就像解码先解码%xx,然后解码+。听起来很合理。。。我还没有发现关于这个话题的任何有用的讨论,似乎这不是一个常见的问题。我将尝试深入挖掘/找到相应的配置设置。我现在检查了与%2B不同的内容。当我将%2520放入URL(%25是的代码)时,它被正确解析为%20,因此我认为没有双重解码。否则%20也将被解码为一个空格。不过还是要谢谢你!我猜任务还在继续。那么Apache在Tomcat前面运行吗?如果是的话,我仍然会查看http.conf设置我认为这是一个特例,我检查过了,Apache肯定是在Tomcat前面运行的。我还发现,当转发到Tomcat时,JkOption ForwardURIProxy“部分地重新编码”URL,并认为将其更改为ForwardURICompatUnparsed可以做到这一点(请参阅),但后来我发现服务器上甚至没有安装jk_mod模块。您知道即使未显式安装,它是否仍与默认值一起使用,或者Apache和Tomcat之间是否必须进行另一次协调?您还提到了ProxyPass指令!?是的,ProxyPass来自mod_代理(我想),它被用来(通过CloudFoundry部署)在一个Tomcat集群之间进行循环。我认为它只是使用了HTTP代理,而不像jk_mod那样使用AJP。