Apache - 如何使用每个 vhost 的重写规则?

Apache - 如何使用每个 vhost 的重写规则?

我已经设置了一个 vHost,如下所示:

<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com

DirectoryIndex index.php
DocumentRoot /var/www/example.com/www/

<Directory />
    Options -FollowSymLinks -Includes -Indexes  -MultiViews
    AllowOverride None
</Directory>
<Directory /var/www/example.com/www/>
    <LimitExcept GET POST>
         deny from all
    </LimitExcept>
    Options -FollowSymLinks -Includes -Indexes  -MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

我想添加一条重写规则如下:

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

这样我就可以向我的网站添加一个子域名,但要确保所有到example.comanything.example.com除此之外的流量dev.example.com都被定向到www.example.com

我应该把这条规则放在哪里才能使其有效?

我尝试了所有方法,包括将其放在 httpd.conf 中,但似乎要么破坏了 vhost 配置,要么没有效果。

任何想法和建议都将不胜感激。

答案1

除非这是您的默认服务器(IEVirtualHost可能是一个NameVirtualHost),否则 apache 将只传递对 example.com 的请求,并www.example.com传递到重写规则(如果它在给定的VirtualHost块内)。如果您添加anything.example.com到 ServerAlias,那么您可能会发现它在该上下文中有效,但仅限于anything.example.com

要使规则生效,您需要将其放在默认VirtualHost块中,即VirtualHost通过 IP 地址(而不是名称)访问服务器时出现的块。在许多 Apache 安装中,这由默认处理程序处理(欢迎使用 Apache 样式页面)。删除该处理程序VirtualHost可以使该处理程序成为默认处理程序,也可以将此虚拟主机进一步移至配置文件中。

相关内容