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

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

当我调用param1包括+作为特殊字符的URL时,例如在我的本地环境和服务器环境中,URL都正确编码为/actionName/my%2Bparam

在我的本地环境中-还使用“prod”作为环境参数-这已在 Controller 中正确解析为my+param。但是,在我的“实际”生产环境(Amazon Web Service EC2实例)中,URL被解析为“我的参数”,这是错误的。

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

有谁知道我可以更深入地发现问题所在?

最佳答案

EC2实例是否在Tomcat之前运行Apache?我之前遇到过参数被两次解码的问题,一次是由Apache解码,另一次是由Tomcat解码。从内存来看,我认为我调整了Apache中ProxyPass指令的配置以进行更正。

编辑:

我发现以下说明与应用程序的源代码一起使用了:)

Apache httpd.conf的补充

AllowEncodedSlashes On
ProxyTimeout 3600

我们还升级了Apache 2.2.12+,以使用启动shell脚本修复HEAD> GET rewrite错误。

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

我认为我必须在服务器上执行此操作,因为您无法使用GUI进行修改。我也有一条说明说,这会导致他们对查询字符串进行编码。也许我必须在我的应用程序中添加一个额外的解码来处理此问题(对不起,我无法确定!)

Tomcat启动参数
-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true

我认为这是为了让tomcat正确处理斜线

干杯

背风处

09-25 18:47
查看更多