ProxyPass 中从 http 到 https 的重定向错误

ProxyPass 中从 http 到 https 的重定向错误

场景如下:

我有一个只能通过一个 URL 访问的 Linux 服务器(因为该服务器是 VPN 中的虚拟机):

网址:http://foo.bar.com

我有几个可以通过这种方式访问​​的网络应用程序:

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

您可能需要启用

SSLProxyEngine On

通过 HTTP 请求代理 SSL。

看:带有 SSL 的 Apache ProxyPass

答案3

问题是我的“ssl_app”是一个使用 websockets 的 Web 应用程序。Apache 不支持 Web 套接字,因此我需要寻找一种方法来“重定向”使用 WebSockets 的应用程序(使用https://github.com/kawasima/mod_proxy_websocket)或者将 http 服务器更换为 Nginx(Nginx 兼容 WebSockets)。

相关内容