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

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

当 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 的攻击的正常有限保护。

相关内容