VirtualHost 相同的 ServerName 不同的目录

Posted

技术标签:

【中文标题】VirtualHost 相同的 ServerName 不同的目录【英文标题】:VirtualHost Same ServerName Different Directories 【发布时间】:2014-12-30 10:38:33 【问题描述】:

我有一个正在运行的生产网站分配给主机(redmine 应用程序)。我需要将新应用程序添加到与子目录相同的主机中。

这是 redmine 应用程序的当前虚拟主机配置,它在主机的基本文件夹中运行。

<VirtualHost *:80>
    ServerName redmine.hostname.com
    DocumentRoot "C:/BitNami/redmine-2.5.1-1/apps/redmine/htdocs/public/"

    RewriteEngine On
    RewriteRule ^/(.*)$ balancer://redminecluster%REQUEST_URI [P,QSA]

    ProxyPass / balancer://redminecluster
    ProxyPassReverse / balancer://redminecluster

    <Proxy balancer://redminecluster>
       BalancerMember http://127.0.0.1:3001
       BalancerMember http://127.0.0.1:3002
    </Proxy>

</VirtualHost>

所以这个应用程序已经在 redmine.hostname.com 上运行。我想添加自己的应用程序,并希望它在 redmine.hostname.com/myapp/ 上运行。

无论我做什么,我都无法做到这一点。我不能改变 redmine 的路径,我必须将新应用程序添加到同一个虚拟主机。除了 80 之外没有其他开放端口,所以我必须让它在 redmine.hostname.com/myapp/

上运行

基本上,redmine 应用程序必须回复所有不以 redmine.hostname.com/myapp/ 开头的请求。我的应用应回复所有以 redmine.hostname.com/myapp 开头的请求。

我应该使用什么设置?

【问题讨论】:

【参考方案1】:

如果你的应用程序 /myapp 位于 c:/myappdir,配置 apache 做你想做的最简单的方法就是使用这个配置:

<VirtualHost *:80>
    ServerName redmine.hostname.com
    DocumentRoot "C:/BitNami/redmine-2.5.1-1/apps/redmine/htdocs/public/"

    Alias /myapp "c:/myappdir"
    ProxyPass /myapp !

    ProxyPass / balancer://redminecluster/
    ProxyPassReverse / balancer://redminecluster/

    <Proxy balancer://redminecluster>
       BalancerMember http://127.0.0.1:3001
       BalancerMember http://127.0.0.1:3002
    </Proxy>

</VirtualHost>

使用感叹号作为 ProxyPass 的目标将从代理配置中排除 /myapp,如 here 所述。此外,您不需要特殊的 RewriteRule,因为您不修改 redmine 的请求,ProxyPass 应该就足够了。

【讨论】:

谢谢。这为我指明了解决问题的正确方向。尤其 ”!”在 ProxyPass 中。 我做的一个修改是在 ProxyPass 和 ProxyPassReverse 行的末尾添加斜杠。所以他们变成了“balancer://redminecluster/”。否则将无法正常工作。 我还添加了 ... 我已经修复了 ProxyPass 的尾部斜杠。我认为在示例中添加 子句不是一个好主意,除非您在问题中就访问要求给出一些想法(我希望您只是添加了“全部允许”,但这并不是真正的普遍要求) Inside directory 子句,我正在设置应用程序特定的文件夹权限等等。所以这不是一个交易破坏者,但如果有人需要它,他们可以使用它。谢谢。【参考方案2】:

这在一定程度上取决于您自己的应用是托管在 apache 服务器本身上,还是代理到另一个服务器/进程。

如果它在 apache 服务器本身上,那么只需将 'myapp' 放入文档根目录。然后您需要删除您的 ProxyPass 行并将其替换为 locationmatch 块

<VirtualHost *:80>
    ServerName redmine.hostname.com
    DocumentRoot "C:/BitNami/redmine-2.5.1-1/apps/redmine/htdocs/public/"

    RewriteEngine On
    RewriteRule ^/(.*)$ balancer://redminecluster%REQUEST_URI [P,QSA]

    <LocationMatch "^(?!/myapp)">
        ProxyPassMatch balancer://balancer://redminecluster
    </LocationMatch>

    ProxyPassReverse / balancer://redminecluster

    <Proxy balancer://redminecluster>
        BalancerMember http://127.0.0.1:3001
        BalancerMember http://127.0.0.1:3002
    </Proxy>

</VirtualHost>

因此,策略是将所有 匹配 /myapp 的内容转发到您现有的 redmine 应用程序。与 /myapp 匹配的所有内容都将转到文档根目录。如果您自己的应用程序被代理,那么您需要另一个将 /myapp 代理到正确位置的 locationmatch 块。

【讨论】:

谢谢,我的应用没有代理。它由 apache 托管。我可以使用别名并使其在单独的 conf 文件中工作。在上面的示例中,我应该在 LocationMatch 块中写什么? 您需要将 '/myapp' 替换为您的别名。 没关系,但我需要在 LocationMatch 标签中写什么?我的意思是在您的示例中不是“ProxyPassMatch balancer://balancer://redminecluster”。 我在没有帮助的情况下尝试了上面的示例。我不能让它工作。 Myapp 不使用任何代理。你能再帮忙一点吗?谢谢。 我需要更多信息。您的应用所在位置的真实名称是什么?如果您将 /myapp 替换为应用程序的目录/别名,则上述内容应该有效。您不需要更改 locationmatch 的内容。正如我在答案中所说,策略是将所有 匹配 /myapp 的内容发送到您现有的代理。

以上是关于VirtualHost 相同的 ServerName 不同的目录的主要内容,如果未能解决你的问题,请参考以下文章

VirtualHost 相同的 ServerName 不同的目录

我可以使用相同的域名和相同的端口设置 VirtualHost [关闭]

windows7中Apache上的虚拟主机

百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用

Django:如何在生产中的apache服务器上部署静态文件

Laravel5 仅在 linux 中显示默认页面...在 windows 中同样有效