从.htaccess mod_rewrite规则中排除子域名?

时间:2010-12-09 16:59:36

标签: php .htaccess mod-rewrite

我对.htaccess文件不太熟悉,而且我正在尝试从已经存在的以下重写规则中排除子域名(类似dev.example.com)):

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

此规则禁止任何人只需输入example.comhttp://example.com并强制显示网址http://www.example.com的所需内容。

我尝试了从这个重写规则中排除子域名的一些选项,但无济于事。该站点上的每个目录都有自己的.htaccess文件,但似乎这个目录仍然优先。有任何想法吗?谢谢!

3 个答案:

答案 0 :(得分:14)

现有规则已经排除了子域名。你只需要添加一个新条件:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

你也可以摆脱正则表达式:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=www.example.com [NC]
RewriteCond %{HTTP_HOST} !=dev.example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

语法可在http://httpd.apache.org/docs/2.2/en/mod/mod_rewrite.html#rewritecond

找到

答案 1 :(得分:3)

我不确定这是否适合您,但最好使用apache virtualhosts配置而不是.htaccess文件。在这种情况下,对于非www - > www redirect,我通常使用类似的东西:

<VirtualHost *:80>
    ServerName  example.com
    RedirectMatch permanent ^(.*) http://www.example.com$1
</VirtualHost>

这通常比mod_rewrite规则更安全。

答案 2 :(得分:3)

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(dev|www)\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]