场景如下:
我有一个只能通过一个 URL 访问的 Linux 服务器(因为该服务器是 VPN 中的虚拟机):
我有几个可以通过这种方式访问的网络应用程序:
foo.bar.com/java_app => 安装在 tomcat 中的 java wep 应用程序
foo.bar.com/webpage => 安装在 apache 服务器中的网页
- Linux 服务器有一个 apache2 服务器,它允许我使用几个配置文件来创建虚拟主机来解决上一个问题:
注意:myhost => localhost
ProxyPreserverHost On
<VirtualHost *:80>
ServerName foo.bar.com
DocumentRoot /var/www/webpage
JkMountCopy On
SSLProxyEngine On
ProxyPass /java_app http://myhost:8080/java_app
ProxyPassReseverse /java_app http://myhost:8080/java_app
#This uses the DocumentRoot
ProxyPass /webpage http://myhost:80/
ProxyPassReseverse /webpage http://myhost:80/
</VirtualHost>
问题是我在 node.js 中获得了另一个可以通过此 URL 内部访问的软件:
https://myhost:8061. (a webpage too).
解决方案可能是添加以下几行:
ProxyPass /ssl_app https://myhost:8061/
ProxyPassReseverse /ssl_app https://myhost:8061/
但这失败了。问题是网页的文件(源)(js、css、其他文件)无法正确加载,因此 Web 应用程序也无法正确加载。(Firefox)
例如在“foo.bar.com/ssl_app”中我可以看到源的 URL,这些 URL 必须是这样的:
foo.bar.com/ssl_app/js/one.js foo.bar.com/ssl_app/js/two.js foo.bar.com/ssl_app/css/css.js
但是我得到这样的方式:
foo.bar.com/js/one.js foo.bar.com/js/two.js foo.bar.com/css/css.js
(foo.bar.com/ssl_app 的重定向 => foo.bar.com/)
显然该网络应用程序无法运行。
因此,如果我直接输入 foo.bar.com/css/css.js,该文件就会正确显示。
日志详细信息:
*** File does not exist: /var/www/webpage/lib, refere http://foo.bar.com/ssl_app
我认为这适用于 DocumentRoot (/var/www/webpage/),但如何使用相同的 ServerName 创建新的 VirtualHost?
有人可以告诉我在 apache 配置中可以查看什么吗?
谢谢。
答案1
您似乎认为 ProxyPassReverse 还会修改后端提供的内容中的 URL。这是不正确的。仅当您的后端服务器(您的“ssl_app”)发送重定向时,才会使用 ProxyPassReverse。内容本身不会受到影响。
您有多种选择:
- 修改您的“ssl_app”,使其使用正确的资源基本 URL。这是最佳解决方案。
- 在将后端提供的 html 转发到客户端之前,使用 mod_proxy_html 修改它。
答案2
答案3
问题是我的“ssl_app”是一个使用 websockets 的 Web 应用程序。Apache 不支持 Web 套接字,因此我需要寻找一种方法来“重定向”使用 WebSockets 的应用程序(使用https://github.com/kawasima/mod_proxy_websocket)或者将 http 服务器更换为 Nginx(Nginx 兼容 WebSockets)。