我已经使用 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