2012-01-13 73 views
2

我已经阅读了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

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

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

0 www 
1 partner1 
2 partner2 
3 partner1 

然后编译它,使用添加到您的RewriteRules找出前缀是否是合作伙伴或没有,像这样:

<VirtualHost *> 
    ServerAdmin [email protected] 
    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> 
+1

这可能是解决方案(+1)的一部分,但它可能是您的解决方案太多而不是他的问题的解决方案。例如,他需要处理几个不同的域。所以这可能需要进一步的解释。例如,在匹配重写中设置PARTNER env变量的效果如何? – regilero 2012-01-13 20:06:17

+0

嘿你是对的人我在我的答案中犯了一个错误,纠正了......然后解释:在匹配重写中设置PARTNER env变量的效果可以帮助你知道前缀是否有效。 I.E.如果你有伙伴1,伙伴2和伙伴3以及某人类型为“partner47.mydomain.com”,那么你就会知道伙伴47不是伙伴,因为'伙伴'的默认值='notfound'=>最后一个重写游戏将执行404对于不知情的合作伙伴。尽管我们可以重定向到www.mydomain.com – 2012-01-13 22:13:37

相关问题