首页 > 解决方案 > Apache ProxyPass 不适用于自定义应用程序

问题描述

我有以下情况:我需要调用以下网址http://myapp.mydomain.com

并且网址应回复如下 http://myapp.mydomain.com/index.jsp

在我的 apache 2.4 上,我尝试了不同的设置,但似乎没有一个工作,

第一次尝试

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /myapp http://127.0.0.1:8080/myapp
    ProxyPassReverse /myapp http://127.0.0.1:8080/myapp
</VirtualHost>

第二次尝试

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass /myapp/ http://127.0.0.1:8080/myapp/
    ProxyPassReverse /myapp/ http://127.0.0.1:8080/myapp/
</VirtualHost>

第三次尝试

    <Location "/myapp/">
        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:8080/myapp/
        ProxyPassReverse / http://127.0.0.1:8080/myapp/
   </Location>

第四次尝试

<Location "/myapp/">
    ProxyPreserveHost On
    ProxyPass /myapp/ http://127.0.0.1:8080/myapp/
    ProxyPassReverse /myapp/ http://127.0.0.1:8080/myapp/

似乎所有配置都不起作用,urlhttps://myapp.mydomain.com显示了tomcat 的欢迎页面。我对 apache 应用的任何配置,使其工作的唯一方法是在链接上手动添加代理的挂载点,如下所示

http://myapp:mydomain.com/myapp/index.jsp

关于如何使这项工作的任何建议?提前致谢。

标签: apachehttp-proxyproxypass

解决方案


我没有足够的信誉发表评论并要求澄清,因此我将根据您的反馈编辑我的答案。

使用 VirtualHost 时,我认为这是您的最佳选择,您还需要ServerName包含一个指令。(也许您出于某种原因故意在这里省略了它,但我在下面的示例中展示了它)。

另外,我相信您的路由参数需要用引号括起来ProxyPass,这与VirtualHost 中的许多其他项目不同。请特别注意目标后面的斜杠(第二个参数)。由于您所需的 URL 将位于子域的根路径中,因此请确保您指明了(作为第一个参数,)。这应该会导致 URL指向您想要的。(在您的示例 2 中,您创建了第一个参数,因此,您必须将其添加到您的 URL 才能访问它,正如您所指出的 - 减去您将冒号换成点的位置。)ProxyPassReverse myappindexmyapp.mydomain.com/https://myapp.mydomain.comhttp://127.0.0.1:8080/myapp//myapp/

(免责声明:我对 Tomcat 了解不多,但我的假设是 index.jsp 应该像大多数其他“索引”文件一样被对待,因为如果它们存在并且可以,那么它们将被查找和使用,因此,从客户端请求的 URL 中省略)。

我还添加了ProxyRequests以下内容,因为我不知道默认值是否为“关闭”,但除非您使用正向代理(而不是您想要的明显反向)我认为这至少是一个潜在的安全问题不是这样做。

减去您未在此处显示的任何其他指令,似乎这应该可以解决问题:

<VirtualHost *:80>
  ServerName myapp.mydomain.com
  ProxyRequests off
  ProxyPreserveHost On
  ProxyPass "/" "http://127.0.0.1:8080/myapp/"
  ProxyPassReverse "/" "http://127.0.0.1:8080/myapp/"
</VirtualHost>

原始回复来自手机;我已经清理了它并从桌面添加了一个示例和更清晰的解释。


推荐阅读