在 Apache VirtualHost 内重定向 URL?

在 Apache VirtualHost 内重定向 URL?

我有一台装有 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.comVirtualHost但性能将与重定向不同。

编辑

由于您想要重定向,并且不需要高级功能,因此使用似乎Redirect就足够了。您可以将它放在RedirectVirtualHost 指令下。

客户端解决方案是使用meta refresh标签。

答案4

好吧,您可以为服务器名称 www.example.com 创建一个虚拟主机,并将其重定向到服务器名称为 example.com 的另一个虚拟主机

相关内容