按请求路径使用Apache Alias拆分DocumentRoot

时间:2016-05-01 08:08:11

标签: apache .htaccess mod-alias

我试图慢慢接管现有网站,按路线路线。我发现Apache的Alias(Match)似乎允许我为每个请求设置不同的(内容)文档根目录。但我没有使用尾随斜杠和更复杂的路径。

我现在的目标是让旧网站按照惯例提供服务。要建立一个新网站,提供第一个特定请求,请说/foo/foo/*

我的vhost设置如下:

<VirtualHost *:80>
    ServerName example.com
    UseCanonicalName on

    AliasMatch ^/foo/(.*)$ /www/new/$1
    AliasMatch ^/foo$ /www/new/$1
    <Directory /www/new/>
        Options +FollowSymLinks -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    DocumentRoot /www/old
    <Directory /www/old/>
        Options +FollowSymLinks -MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

在两个目录中,我都有一个.htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ index.php/$1 [L]

index.php的节目&#39; old&#39;或者&#39; new&#39;取决于他们的目录。

我测试的不同路线会发生什么:

  • 请求example.com/bar时,会显示“旧”字样。
  • 在请求example.com/foo时,它会重定向/foo/,然后显示“&#39; new&#39;。
  • 请求example.com/foo/bar时,会显示“旧”字样。

我不希望将/foo强制重定向到/foo/。我希望/foo/bar能够展示新的&#39;。

我一直关注Apache's mod_alias获取多个AliasMatch指令,以便在/foo之后捕获任何内容,但显然这些指令无法正常工作。此外,我不会在那里读到任何神奇地添加的尾部斜线。

任何人都知道魔术?

1 个答案:

答案 0 :(得分:0)

我已经能够通过调整Alias直接指向index.php来解决这个问题:

AliasMatch ^/foo/(.*)$ /www/new/index.php
AliasMatch ^/foo$ /www/new/index.php

然后/bar以及其他任何内容都会转到旧网站,/foo/foo//foo/bar会转到新网站。

此方法有两个缺点:

  • 完全跳过新网站中的.htaccess。但是,由于我主要使用它来让index.php接收每条路线,所以现在很好。
  • 像css / js这样的前端资源会转到旧网站。使用其他简单别名修复此问题:example.com/frontend/app.css + Alias /frontend /www/new/public_html/frontend