使用 VirtualDocumentRoot 将 www.example.com 重定向到 example.com

使用 VirtualDocumentRoot 将 www.example.com 重定向到 example.com

我已经使用 VirtualDocumentRoot 配置了 apache 并且它运行良好:

UseCanonicalName Off
VirtualDocumentRoot /var/www/%0/app/www

但对于每个域目前我需要 2 个目录:

这是我的申请

/var/www/example.com/app/www

另一个目录仅包含.htaccess重定向到 example.com

/var/www/www.example.com/app/www

我的问题是:有什么方法可以自动将每个以 www 为前缀的域名重定向到其非 www 对应的域名?

答案1

好的,这是一个老问题,但既然我是在谷歌上发现的,其他人可能也会来这里,为什么不给未来的访问者一个不同的解决方案呢?(虽然从技术上讲这不是对 OP 问题的回答,因为你要求重定向,但我认为它确实解决了你的问题)

根据您的需要,您可以:

1)将域名的所有内容放到同一目录中:example.com www.example.com foo.example.com 全部放到 /var/www/example.com/app/www

<VirtualHost *:80>
    ServerName catch.all
    ServerAlias *
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/app/www
</VirtualHost>

2)具有类似 /var/www/[domain]/[subdomain] 的目录结构。example.com 和 www.example.com 都转到 /var/www/example.com/www,而 shop.example.com 将从 /var/www/example.com/shop 提供服务

<VirtualHost *:80>
    ServerName sub.domain
    ServerAlias *.*.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
</VirtualHost>

<VirtualHost *:80>
    ServerName bare.domain
    ServerAlias *.*
    VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
</VirtualHost>

注意:www 将由 sub.domain 规则提供服务。不存在的子域名将导致 404。

答案2

好的,添加这种重定向非常容易,只需要添加服务器范围的重写规则。

我的虚拟主机的最终配置如下

<VirtualHost *:80>
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/%0/app/www
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1$1 [R=301,L]
    <Directory /var/www/%0/app/www>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
... other options

相关内容