如何在Apache虚拟主机中配置exist-db多子域名应用
解决Apache反向代理Exist-db子域名路径重复问题
你的问题核心是代理配置与Exist-db内部路径生成的不匹配——错误里的重复路径/exist/apps/myapp1/exist/apps/myapp1/说明请求被Apache和Exist-db重复拼接了路径,我来一步步帮你修复:
第一步:修正Apache虚拟主机配置
原有配置存在两处关键错误,替换成下面的配置:
<VirtualHost xx.xx.xx.xxx:80> ServerName myapp1.mydomain.com ProxyRequests Off ProxyPreserveHost On # 将子域名根路径代理到Exist-db的应用路径 ProxyPass / http://localhost:8080/exist/apps/myapp1/ ProxyPassReverse / http://localhost:8080/exist/apps/myapp1/ # 修正Cookie路径:把Exist-db内部的应用路径映射到子域名根路径 ProxyPassReverseCookiePath /exist/apps/myapp1 / # 修正Cookie域名,确保前端能正确接收 ProxyPassReverseCookieDomain localhost myapp1.mydomain.com # 告诉Exist-db它运行在反向代理后的根路径下 RequestHeader set X-Forwarded-Proto "http" RequestHeader set X-Forwarded-Host "myapp1.mydomain.com" RequestHeader set X-Forwarded-Path "/" </VirtualHost>
关键修改说明:
- 调整
ProxyPassReverseCookiePath:原来的/exist /错误映射了整个Exist-db根路径,实际你的应用在/exist/apps/myapp1下,必须让Cookie路径和应用路径对应。 - 移除多余的Rewrite规则:
RewriteRule ^/(.*)$ /$1 [PT]完全冗余,反而会干扰ProxyPass的路径转发逻辑。 - 添加
X-Forwarded-*请求头:让Exist-db识别外部访问的域名、协议和根路径,生成正确的前端可访问URL,而不是泄露内部的/exist/apps/myapp1路径。
第二步:配置Exist-db支持反向代理
打开Exist-db的conf/conf.xml文件,找到<http-server>节点下的<parameters>,添加或修改以下参数:
<parameter name="forwarded" value="true"/>
这个参数会让Exist-db读取Apache设置的X-Forwarded-*头,自动适配外部访问路径,避免生成带内部前缀的URL。
第三步:优化Controller.xql的路径逻辑(可选但保险)
你的controller.xql里的跳转依赖$exist:prefix变量,这个变量默认是Exist-db内部的应用路径。为了避免路径拼接问题,建议把根路径跳转改成相对路径:
if ($exist:path eq "/") then (: 使用相对路径避免前缀重复 :) <dispatch xmlns="http://exist.sourceforge.net/NS/exist"> <redirect url="./index.html"/> </dispatch>
同时检查所有<forward>和<redirect>的URL,尽量使用相对路径或依赖$exist:controller变量(它会自动适配代理后的应用根路径)。
完成以上修改后,重启Apache和Exist-db,再访问myapp1.mydomain.com就能正常加载应用了。
内容的提问来源于stack exchange,提问作者nassoo
相关产品推荐
相关产品推荐

