虚拟主机映射到目录结构

时间:2012-01-13 13:03:20

标签: apache mod-rewrite virtualhost

我已经阅读了关于apache的大规模虚拟主机帮助,但作为一个相对新手,我有点困惑。我知道我的问题必须是可以实现的,因为这是一个非常基本的问题,但我迷失了......

基本上我有很多虚拟主机指向我的服务器,并且他们指向的DocumentRoot的文件结构是一致的......例如..

www.mydomain.com -> /home/blah/vhosts/mydomain.com/www/public
abc.mydomain.com -> /home/blah/vhosts/mydomain.com/abc/public

www.another.co.uk -> /home/blah/vhosts/another.co.uk/www/public
def.another.co.uk -> /home/blah/vhosts/another.co.uk/def/public

如果可能的话,我还需要将非www。*重定向到www。*,但考虑到子域的可能性,以便:

  • mydomain.com被重定向到www.mydomain.com
  • abc.mydomain.com 重定向到www.mydomain.com 处理上面的定义(由于目录结构)

这一切都可能吗?

1 个答案:

答案 0 :(得分:1)

这是我为所有虚拟主机做的事情:我正在使用Apache writemap

与合作伙伴一起创建一个新的“partner.txt”文件:

0 www
1 partner1
2 partner2
3 partner1

然后编译它,并将其用于你的rewriterules以找出前缀是否是伙伴,如下所示:

<VirtualHost *>
    ServerAdmin webmaster@mydomain.fr
    DocumentRoot "/web/htdocs/olivier/mydomain.fr/dev/website"
    ServerName mydomain.fr
    ServerAlias *.mydomain.fr
    ErrorLog "/web/logs/mydomain.error.log"
    CustomLog "|/opt/httpd/bin/rotatelogs /web/logs/mydomain.fr/access_log.%Y-%m-%d-%H_%M_%S.log 5M" combined
    ErrorDocument 404 /404.php

    RewriteEngine On
    # trying to hack = redirect:
    RewriteRule (.*)setup.php http://disneyland.fr/ [NC,R,L]
    RewriteRule (.*)admin(.*) http://disneyland.fr/ [NC,R,L]

    # if your host doesn't begin with "www" add it and redirect:
    RewriteCond %{HTTP_HOST} ^mydomain\.(fr|com|net|org|eu) [NC]
    RewriteRule (.*) http://www.mydomain.%1$1 [QSA,R=301,L]

    RewriteMap partners \
      dbm:/web/htdocs/olivier/mydomain.fr/rewriterules/partners.map

    # test if known partner:
    RewriteCond %{HTTP_HOST} (([a-zA-Z0-9\-]+)\.)mydomain.com$
    RewriteRule (.*) - [QSA,E=PARTNER:${templates:%1|notfound}]

    # if partner not found or empty, 404:
    RewriteCond %{ENV:PARTNER} ^$ [OR]
    RewriteCond %{ENV:PARTNER} notfound
    RewriteRule .* - [R=404,L]
</VirtualHost>