使用mod_proxy通过%20代理URL时的Apache 500

当URL中存在编码空间时,我们正在接受来自Apache的500个代理,而代理对tomcat的调用。

我们正在迁移一个运行良好的J2EE容器的应用程序,该容器有一个较早的集成版本的Apache(1.x),但是当我们将应用程序移动到Tomcat + Apache 2 + mod_proxy后,我们开始发现错误。

例如:

http://foo.org/app/rest/no_spaces/ works fine http://foo.org/app/rest/no%20spaces fails with a 500 

如果我们直接打了tomcat,那么请求就可以正常工作,而且我们知道在通过Apache时它并没有到达servlet。

对于foo.org上的服务器,代理configuration如下:

 ProxyPass /app ajp://127.0.0.1:8080/app ProxyPassReverse /app ajp://127.0.0.1:8080/app 

我们尝试切换到HTTP而不是AJP,而不会改变错误。

主要的理论是,mod_proxy正在解码%20,然后期望看到其他HTTP头信息,而不是剩余的URL子string,并导致500.如果是这样的话,有没有人有一个解决方法,不涉及重写应用程序。 如果这不是原因,有没有人有什么build议呢?

我没有看到在我的search中确切的症状的文档或错误报告。

提前致谢。

是否将“nocanon”添加到ProxyPass规则中?

即ProxyPass / app ajp://127.0.0.1:8080 / app nocanon

从文档:

通常,mod_proxy将规范ProxyPassed URL。 但是这可能与一些后端不兼容,特别是那些使用PATH_INFO的后端。 可选的nocanon关键字抑制了这一点,并将URLpath“raw”传递给后端。 请注意,这可能会影响后端的安全性,因为它会消除代理提供的基于URL的攻击的正常有限保护。