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/”。否则将无法正常工作。 我还添加了这在一定程度上取决于您自己的应用是托管在 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 [关闭]
百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用