在Apache VirtualHost中重定向URL?


61

我有一个专用于Apache的服务器,在该服务器上设置了一些VirtualHosts。我已经设置了一个网站来处理www域名和非www域名。

我的VH .conf文件,用于www:

<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文件中执行此操作。


Answers:


105

事实证明mod_rewrite,除了RewriteBase规则之外,VirtualHosts文件中的规则还不错。我结束了这个:

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

编辑:根据评论中的乔希的建议,我现在正在使用Redirect来自mod_alias以下指令的简化版本:

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

2
您不需要为此的mod_rewrite。请改用mod_alias及其RedirectPermanent指令。
joschi 2010年

@joschi:这样做的好处是什么?它更快吗?
DisgruntledGoat 2010年

12
您不需要成熟的重写引擎及其所有检查功能和仅重定向客户端的功能。由于mod_alias的复杂性不如mod_rewrite复杂,并且只需要一个指令(RedirectPermanent),而不是mod_rewrite的两个指令,这将(略微)更快。最后但并非最不重要的一点是恕我直言,当有人第一次查看配置时,它会更容易理解配置中发生的情况。
2010年

1
由于某些奇怪的原因,重定向301 ..对我们不起作用。我们必须使用RewriteRule选项。
so_mv 2012年

注意:在Windows Server 2008 R2 Enterprise的WAMPSERVER 2.0上使用PHP 5.3.0(不包括:80之后)VirtualHost *会导致所有内容返回“禁止”!
Cees Timmerman 2014年

4

对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可能会损害您的网络。


5
301的要点是它是永久重定向。如果要进行永久重定向,则应改用302或307。
nickgrim

2

您可以添加ServerAlias example.comVirtualHost,但性能将重定向不同。

编辑

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

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


您能进一步解释一下吗?我将如何重定向www.example.comexample.com使用此方法?
DisgruntledGoat 2010年

在主虚拟主机中,您同时具有ServerName和的条目ServerAlias。一个拥有example.com,另一个拥有www.example.com。然后,两个dns条目都将访问同一虚拟主机中指定的文档。
华纳2010年

我想进行重定向,而不仅仅是别名。
DisgruntledGoat 2010年

那么joshchi的推荐可能对您来说是一个好方法。似乎在这一点上头发正在分裂。
华纳2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.