带有代理和位置的 Apache 配置

带有代理和位置的 Apache 配置

我想将这些域映射到这些端口。我该怎么做?

http://test1.example.com/phpmyadmin/    example.com:80/phpmyadmin/
http://test1.example.com/app1/          example.com:8080/app1/
http://test1.example.com/app2/          example.com:8090/app2/

http://webmin.example.com/              example.com:10000/

这就是我所做的。问题是,phpmyadmin不起作用。它被转发到glassfish.

webmin正在工作,因为它是一个单独的域。

如何映射phpmyadmin到同一个域?http://test1.example.com/phpmyadmin/

<VirtualHost *:80>
    ServerName              test1.example.com
    ProxyRequests           Off
    ProxyPreserveHost       On

    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPass           /           http://localhost:8080/
    ProxyPassReverse    /           http://localhost:8080/

    ProxyPass           /admin/     https://localhost:4848/
    ProxyPassReverse    /admin/     https://localhost:4848/
</VirtualHost>

<VirtualHost *:80>
    ServerName      test1.example.com/phpmyadmin/
    DocumentRoot    /usr/share/phpmyadmin

    Alias           /phpmyadmin     /usr/share/phpmyadmin
    Alias           /mysql          /usr/share/phpmyadmin
</VirtualHost>

<VirtualHost *:80>
    ServerName              webmin.example.com
    ProxyRequests           Off
    ProxyPreserveHost       On

    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPass           /               http://localhost:10000/
    ProxyPassReverse    /               http://localhost:10000/
</VirtualHost>

答案1

将新位置放入顶部 VirtualHost 块内:

<VirtualHost *:80>
    ServerName              test1.example.com
    ProxyRequests           Off
    ProxyPreserveHost       On

    <Proxy *>
    Order deny,allow
    Allow from all
    </Proxy>

    ProxyPass           /           http://localhost:8080/
    ProxyPassReverse    /           http://localhost:8080/

    ProxyPass           /admin/     https://localhost:4848/
    ProxyPassReverse    /admin/     https://localhost:4848/

    ProxyPass           /phpmyadmin/     https://localhost:80/phpmyadmin/
    ProxyPassReverse    /phpmyadmin/     https://localhost:80/phpmyadmin/

    ProxyPass           /app1/     https://localhost:8080/app1/
    ProxyPassReverse    /app1/     https://localhost:8080/app1/

    ProxyPass           /app2/     https://localhost:8090/app2/
    ProxyPassReverse    /app2/     https://localhost:8090/app2/
</VirtualHost>

答案2

正如 @josh-jolly 所建议的……将各种代理语句放入单个 VHost 中是有帮助的,因为您的配置有多个 VHost,所有这些 VHost 都在端口 80 上监听任何内容。

复杂性的基本顺序

然而,Josh 的建议没有传达(并且在他的示例中错误地说明)的是 mod_proxy 与 mod_rewrite 一样,按照接收的顺序处理提供的模式。

这意味着,如果您将以下几行放在其他 ProxyPass/ProxyPassReverse 块之前,则所有流量都将被此模式捕获。

ProxyPass           /           http://localhost:8080/
ProxyPassReverse    /           http://localhost:8080/

这可能就是为什么所有流量都被发送到 Glassfish,而不是您想要的流量发送到 PHPMyAdmin。

复杂性的嵌套顺序

同样,您应该小心您希望以不同方式路由但嵌套的 URL 模式的复杂性规则的顺序。

以下示例显示了精心设计的复杂顺序规则集。

ProxyPass           /myapp          http://localhost:9090/
ProxyPassReverse    /myapp          http://localhost:9090/

ProxyPass           /myapp/images   http://localhost:8080/
ProxyPassReverse    /myapp/images   http://localhost:8080/

在此示例中,所有流量都将流向 9090 端口,因为两个 url 都会联系,/myapp但 mod_proxy 在到达该/myapp/images模式之前会匹配更基本的模式。

由于 URL 模式的复杂程度降低,按如下方式对块进行排序将允许两种模式适当匹配。

ProxyPass           /myapp/images   http://localhost:8080/
ProxyPassReverse    /myapp/images   http://localhost:8080/

ProxyPass           /myapp          http://localhost:9090/
ProxyPassReverse    /myapp          http://localhost:9090/

好习惯

  1. 在您的 VHost 配置中包含注释。您并不总是更新或管理它们的人。
  2. ProxyPass 和 ProxyPassReverse 应始终匹配。我从来没有找到两个指令应该不同的有效用途。在 URL 模式中包含或不包含尾部斜杠时尤其如此。
  3. 将相关指令分组在一起,并使用某种注释块在视觉上将它们分开。这对于大型或复杂的 VHost 配置特别有用。但是当练习成为一种习惯会让你的生活变得更加轻松。

相关内容