当 URL 中存在编码空格时,我们在代理对 tomcat 的调用时会收到 Apache 的 500 错误。
我们正在迁移一个在具有旧版 Apache(1.x)的 J2EE 容器上运行良好的应用程序,但是当我们将该应用程序移至 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 上的服务器,代理配置如下:
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 子字符串,因此导致错误代码为 500。如果是这种情况,是否有人有不涉及重写应用程序的解决方法。如果这不是原因,是否有人能给出建议?
在我的搜索中我没有看到任何关于此确切症状的文档或错误报告。
提前致谢。
答案1
将“nocanon”添加到你的 ProxyPass 规则中是否有效?
即 ProxyPass /app ajp://127.0.0.1:8080/app nocanon
来自文档:
通常,mod_proxy 会规范化 ProxyPassed URL。但这可能与某些后端不兼容,尤其是那些使用 PATH_INFO 的后端。可选的 nocanon 关键字会抑制这种情况,并将 URL 路径“原始”传递给后端。请注意,这可能会影响后端的安全性,因为它会删除代理提供的针对基于 URL 的攻击的正常有限保护。