我有一台装有 Apache 的专用服务器,并在其上设置了一些 VirtualHost。我设置了一个来处理 www 域和非 www 域。
我的 www VH.conf 文件:
<VirtualHost *>
DocumentRoot /var/www/site
ServerName www.example.com
<Directory "/var/www/site">
allow from all
</Directory>
</VirtualHost>
有了这个.htaccess
:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
有没有简单的方法可以将 www 重定向到非 www 版本?目前,我将两个版本发送到同一个DocumentRoot
并使用.htaccess
,但我确信我必须能够在 VirtualHost 文件中执行此操作。
答案1
事实证明,mod_rewrite
除了规则之外,VirtualHosts 文件中的规则都很好RewriteBase
。我最终得到了这个:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>
编辑:根据评论中 joschi 的建议,我现在使用这个简化版本Redirect
指令来自mod_alias
:
<VirtualHost *>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>
答案2
对 301 重定向要非常小心,因为默认情况下,接收 301 重定向的浏览器会永久存储它 - 这意味着您将放弃对该浏览器尝试访问域时将看到的内容的控制www.example.com
。
例如参见此讨论http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/
因此,要么确保它不会被缓存,要么使用 mod_proxy(我推荐 mod_proxy)。
如果您希望让用户在浏览器地址栏上看到 URL 的变化,请使用 mod_rewrite:
<VirtualHost *>
ServerName www.example.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>
如果您希望“重定向”对用户不可见,请使用 mod_proxy:
<VirtualHost *>
ServerName www.example.com
ProxyRequests Off
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 203.0.113.67
</Proxy>
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
</VirtualHost>
需要注意的是,如果配置不当,mod_proxy 可能会损害您的网络。
答案3
您可以添加ServerAlias example.com
,VirtualHost
但性能将与重定向不同。
编辑
由于您想要重定向,并且不需要高级功能,因此使用似乎Redirect
就足够了。您可以将它放在Redirect
VirtualHost 指令下。
客户端解决方案是使用meta refresh
标签。
答案4
好吧,您可以为服务器名称 www.example.com 创建一个虚拟主机,并将其重定向到服务器名称为 example.com 的另一个虚拟主机