2

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

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

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

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

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

有人知道我可以在哪里更深入地找出问题吗?

4

2 回答 2

3

EC2 实例是否在 Tomcat 前面运行 Apache?我之前曾遇到过参数被解码两次的问题,一次由 Apache 解码,然后又由 Tomcat 解码。从记忆中,我想我调整了 Apache 中 ProxyPass 指令的配置以更正它。

编辑:

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

Apache httpd.conf 添加

AllowEncodedSlashes On 
ProxyTimeout 3600

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

我还在 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 正确处理斜线

干杯

于 2010-11-08T07:33:11.817 回答
1

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

这已正确解析为控制器中的 my+param

不,预期的分辨率是“我的参数”(带空格)。
由于这适用于 Amazon 主机,因此您需要在本地将 Grails 升级到 1.3.5。

于 2010-10-25T14:34:45.850 回答