只是为了让生活变得困难-我正在尝试设置双反向代理:
WWW > Router > Apache Reverse Proxy #1 (443) > Apache Reverse Proxy (443) #2 > Docker Container (Which runs on same machine as #2)
两个反向代理都有 FQDN。我正在尝试使用虚拟主机,但显然不明白如何设置代理。
主域名是example.com
(托管在 Apache #1 上),子域名是office.example.com
(托管在 Apache #2 上)。
在 Apache #1 上,我必须设置虚拟主机(example.com
和office.example.com
)。虚拟主机文件office.example.com
如下所示:
<VirtualHost *:443>
ServerName office.example.com
UseCanonicalName off
DirectoryIndex index.html index.htm /index.php index.php
DocumentRoot /usr/local/www/office
....
....
# keep the host
ProxyPreserveHost On
ProxyPass / https://office.example.com
ProxyPassReverse / https://office.example.com
....
....
</VirtualHost>
我的 DNS 记录在 Cloudflare,并且office.example.com
都example.com
解析到同一个外部 IP 地址。但是,pfSense 路由器有一个 DNS 覆盖,将 office.example.com 重新分配给内部 LAN 地址
在 Apache #2 上,我的虚拟主机文件显示如下:
<VirtualHost *:443>
ServerName office.example.com
DocumentRoot "/var/www/office.example.com/html"
DirectoryIndex index.html index.htm /index.php index.php
...
...
ProxyPreserveHost On
# static html, js, images, etc. served from loolwsd
# loleaflet is the client part of LibreOffice Online
ProxyPass /loleaflet http://127.0.0.1:9980/loleaflet retry=0
ProxyPassReverse /loleaflet http://127.0.0.1:9980/loleaflet
...
...
</VirtualHost>
我省略了 SSL 加密项,因为涉及从 Web 到 Apache #1 的 SSL 传输以及从 Apache #1 到 Apache #2 的 SSL 加密。SSL 终止于第二个代理。
从外部我可以到达,https://office.example.com
它正确显示index.html
位于 Apache #2 上的文档根目录的文件。
但是我无法解析任何其他链接。如果我尝试:https://office.example.com/data
或,我会收到 500 错误https://office.example.com/loleaflet
。
我认为我遗漏了反向代理请求的一些内容。
答案1
按照上面的建议,我部分找到了这个问题的答案。对于 HTTP/HTTPS 链接,您需要在 URL 后面添加 /。所以:
ProxyPass / https://office.example.com
ProxyPassReverse / https://office.example.com
需要写成
ProxyPass / https://office.example.com/
ProxyPassReverse / https://office.example.com/
这解决了一个问题,我可以接受,但是不幸的是,如果您需要 ProxyPass ws/wss 链接,这将不起作用。我仍在寻找该问题的解决方案。