我正在配置一个 Apache HTTP 服务器,以便它将以 /app/ 开头的请求反向代理到在 Tomcat 服务器中运行的 eXist-db 实例,端口为 8082。此端口已在防火墙中关闭,外部世界无法访问。按照eXist 文档,我的 httpd.conf 文件中有以下规则:
ProxyPass /apps/ http://localhost:8082/
ProxyPassReverse /apps/ http://localhost:8082/
ProxyPassReverseCookiePath /apps/ /
一切顺利,例如“http://mydomain/apps/exist/index.xml'。但是,webstart 客户端(可从 'http://localhost:8082/exist/webstart/exist.jnlp' 在 Web 服务器上)在代理后面不起作用。虽然 'http://mydomain/apps/exist/webstart/exist.jnlp' 确实生成了有效的 exist.jnlp 文件,但该文件无法执行。原因似乎很明显:显然,生成 exist.jnlp 文件的 eXist-db 实例仅将代理请求视为:'http://localhost:8082/exist/webstart/exist.jnlp'。但是,由于 exist.jnlp 文件是在客户端上执行的,因此该引用毫无意义(除非客户端计算机恰好在该端口上运行 eXist-db 实例)。因此,执行 exist.jnlp 文件会失败,并出现“连接被拒绝”错误。
然而,使用 URL xmldb:exist://mydomain/apps/exist/xmlrpc 将本地 eXist-db Java 客户端连接到代理 eXist 实例完全没有问题。问题在于生成webstart exist.jnlp 文件,该文件似乎需要访问可公开访问的 URL。但是,打开端口 8082 并替换对“http://本地主机:8082' 和 'http://我的域名:8082'在我看来,这反而破坏了反向代理的意义。
其他人是否已成功在 Apache 后面的封闭端口上反向代理 eXist-db?是否有一些我忽略的代理配置设置(我根本不是专家)可以让 eXist 看到原始请求而不是代理请求?
亲切的问候,
罗恩
答案1
您需要ProxyPreserveHost On
,它将收到的相同 Host: 标头发送到后端服务器。更多信息这里。