我正在努力反向代理在 Apache 后面的封闭端口上的 Tomcat 服务器中运行的应用程序。为了方便起见,假设我想反向代理请求'http://我的域名/apps/my_app/' 到 Tomcat 应用程序 'http://localhost:8082/my_app/' 在远程服务器上。使用 Apache vhost.conf 文件中的以下代理设置,一切正常:
ProxyRequests off
ProxyPass /apps/ http://localhost:8082/
ProxyPassReverse /apps/ http://localhost:8082/
除了应用程序的一部分,它会生成一个要在客户端执行的 Java webstart 文件,并且需要连接到 Tomcat 应用程序'http://localhost:8082/my_app/webstart'(在远程服务器上)。
问题的关键在于这种连接显然不起作用,因为 a) 对 localhost 的请求将相对于客户端计算机进行解释,并且 b) 即使它指向远程服务器,端口 8082 也已关闭。
因此,我弄清楚了 ProxyPreserveHost 如何提供帮助,以便将原始请求的主机名传播到 Java webstart 请求:
ProxyRequests off
ProxyPreserveHost on
ProxyPass /apps/ http://localhost:8082/
ProxyPassReverse /apps/ http://mydomain/
这几乎可以正常工作(即使代理 Tomcat 应用程序中的内部重定向也可以通过 ProxyPassReverse 设置正常工作)。还有一个问题:Java webstart 文件使用的 URL 缺少“/apps/”部分,并将尝试连接到“http://mydomain/my_app/webstart', 代替 'http://mydomain/apps/my_app/webstart',这显然会失败,因为只有以 /apps/ 开头的请求才会被反向代理。显然,代理应用程序无法“看到”完整的原始 URL('http://我的域名/apps/my_app/'),但只有被代理处理过滤掉的部分('http://我的域名/my_app/')。
我是否忘记了任何代理设置,可以让 Apache 将路径从原始 URL 传递到代理应用程序?
亲切的问候,
罗恩
答案1
代理后端根本看不到原始请求;这就是代理的全部意义所在。
您可能需要以下内容:
ProxyPass /apps/ http://localhost:8082/apps/
ProxyPassReverse /apps/ http://localhost:8082/apps/
并使 tomcat 应用程序在该上下文中可用。