Sign up ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I have a dedicated server with Apache, on which I've set up some VirtualHosts. I've set up one to handle the www domain as well as the non-www domain.

My VH .conf file for the www:

<VirtualHost *>
  DocumentRoot /var/www/site
  <Directory "/var/www/site">
    allow from all

With this .htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^ [NC]
RewriteRule ^(.*)$$1 [L,R=301]

Is there a simple way to redirect the www to the non-www version? Currently I'm sending both versions to the same DocumentRoot and using .htaccess but I'm sure I must be able to do it in the VirtualHost file.

share|improve this question

4 Answers 4

up vote 72 down vote accepted

Turns out mod_rewrite rules are fine in the VirtualHosts file, apart from the RewriteBase rule. I ended up with this:

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

EDIT: on the advice of joschi in the comments, I'm now using this simplified version:

<VirtualHost *>
  Redirect 301 /
share|improve this answer
You do not need mod_rewrite for this. Use mod_alias and its RedirectPermanent directive instead. – joschi Mar 9 '10 at 6:58
@joschi: What would be the advantage of that? Is it faster? – DisgruntledGoat Mar 9 '10 at 17:10
You don't need the full-blown rewrite engine with all its checks and possibilities to just redirect the client. It would be (marginally) faster since mod_alias is not near as complex as mod_rewrite and you'd only need one directive (RedirectPermanent) instead of two with mod_rewrite. And last but not least IMHO it's easier to understand what happens in the configuration when someone looks at it the first time. – joschi Mar 10 '10 at 6:00
For some strange reason Redirect 301 .. did not work for us. We had to use the RewriteRule option. – so_mv Apr 5 '12 at 17:42
NOTE: Using PHP 5.3.0 on WAMPSERVER 2.0 on Windows Server 2008 R2 Enterprise, not including :80 after VirtualHost * causes everything to return "Forbidden"! – Cees Timmerman Sep 4 '14 at 12:33

You can add ServerAlias to the VirtualHost but the performance will differ from a redirect.


Since you want to redirect and you don't need advanced functionality, it seems like using Redirect should suffice for you. You would put the Redirect under a VirtualHost directive.

A client side solution would be to use a meta refresh tag.

share|improve this answer
Can you explain a bit further? How would I redirect to using this method? – DisgruntledGoat Mar 9 '10 at 21:31
In your primary vhost, you have entries for both ServerName and ServerAlias. One has and the other Then, both dns entries will access the documents specified in the same vhost. – Warner Mar 9 '10 at 21:56
I want to do a redirect though, not just an alias. – DisgruntledGoat Mar 10 '10 at 18:17
Then joshchi's recommendation may be a good approach for you. Seems like hairs are being split at this point. – Warner Mar 10 '10 at 18:50

Be very careful with 301 redirects because, by default, a browser that receives the 301 redirect will store it permanently - meaning you will give up control what that browser will see when it tries to access the domain

See for example this discussion

So either make sure it does not get cached, or use mod_proxy (I recommend the mod_proxy).

If you are fine with letting the user see the URL change on the browser address bar, use mod_rewrite:

<VirtualHost *>
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^
 RewriteRule ^/(.*)$$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

If you want the "redirect" to be invisible to the user, use mod_proxy:

<VirtualHost *>
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from
 ProxyPass /
 ProxyPassReverse /

It should be noted that mod_proxy, when badly configured, can harm your network.

share|improve this answer
The point of a 301 is that it's a permanent redirect; if you want a non-permanent redirect, you should use 302 or 307 instead. – nickgrim Nov 26 '13 at 10:04

well, you could create one virtual host for the SERVERNAME and have it redirect to another virtual host with the servername

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.