【问题标题】:VirtualHost Same ServerName Different DirectoriesVirtualHost 相同的 ServerName 不同的目录
【发布时间】: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 开头的请求。

我应该使用什么设置?

【问题讨论】:

    标签: apache mod-rewrite apache2 virtualhost httpd.conf


    【解决方案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 的内容发送到您现有的代理。
    猜你喜欢
    • 2011-07-29
    • 2016-10-02
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多