在 Apache VirtualHost 中重定向 URL?

Dis*_*oat 65 mod-rewrite redirect virtualhost apache-2.2

我有一个带有 Apache 的专用服务器,我在上面设置了一些 VirtualHosts。我已经设置了一个来处理 www 域以及非 www 域。

我的 www 的 VH .conf 文件:

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

有了这个.htaccess

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将 www 重定向到非 www 版本?目前我将两个版本发送到同一个DocumentRoot并使用,.htaccess但我确定我必须能够在 VirtualHost 文件中做到这一点。

Dis*_*oat 116

事实证明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>
Run Code Online (Sandbox Code Playgroud)

编辑:根据 joschi 在评论中的建议,我现在使用这个简化版本的Redirect指令来自mod_alias

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

  • 您不需要完整的重写引擎及其所有检查和可能性来重定向客户端。它会(略微)更快,因为 mod_alias 不像 mod_rewrite 那样复杂,而且你只需要一个指令 (RedirectPermanent) 而不是 mod_rewrite 的两个指令。最后但并非最不重要的是恕我直言,当有人第一次看到它时,更容易理解配置中发生的事情。 (12认同)
  • 为此,您不需要 mod_rewrite。请改用 mod_alias 及其 RedirectPermanent 指令。 (3认同)

小智 5

使用 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>
Run Code Online (Sandbox Code Playgroud)

如果您希望“重定向”对用户不可见,请使用 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>
Run Code Online (Sandbox Code Playgroud)

应该注意的是,mod_proxy 如果配置不当,可能会损害您的网络。

  • 301 的要点在于它是一个“永久”重定向;如果您想要非永久重定向,则应使用 302 或 307。 (7认同)