mod_rewrite用于映射文件中的特定域

时间:2010-12-30 06:01:31

标签: apache mod-rewrite mappings

我有一堆域名,我想要访问一个域名但该域名的各个部分。

# this is what I currently have
RewriteEngine On
RewriteCond %{HTTP_HOST} ^.*\.?foo\.com$ [NC]
RewriteRule ^.*$ ${domainmappings:www.foo.com} [L,R=301]

# rewrite map file
www.foo.com www.domain.com/domain/foo.com.php
www.bar.com www.domain.com/domain/bar.com.php
www.baz.com www.domain.com/other/baz.php.foo

问题是我不想让每个域都成为RewriteCond的一部分。我试过了

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule (.*) http://%1/$1 [R=301,L]

但是这将为每个域做到这一点。我只希望映射文件中的域重定向,如果它与映射文件中的任何域不匹配,则继续执行其他重写。

2 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。您需要做的是在地图上使用管道操作符,以便您拥有一个全能的。

RewriteCond ${domainmappings:%{HTTP_HOST}|NOTFOUND}    ^(.+)$
RewriteCond %1  !^NOTFOUND$
RewriteRule ^.*$ ${domainmappings:%1} [L,R=301]

如果主机不在列表中,则第二个条件将不匹配。你仍然需要处理www前缀和案例匹配,但你明白了。

答案 1 :(得分:0)

我很接近,因为我发现了案例匹配,但无法弄清楚www前缀。如果我使用下面的第一个,它没有www。如果我使用第二个,它适用于www。如果我同时使用 - 两者都不起作用。

RewriteCond %{HTTP_HOST} (.*)$ [NC] # works for without www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] # works with www
RewriteCond ${domainmappings:%1|NOTFOUND} ^(.+)$ [NC]
RewriteCond %1 !^NOTFOUND$
RewriteRule ^.*$ ${domainmappings:%1} [L,R=301]

有什么想法吗?