Take the 2-minute tour ×
Server Fault is a question and answer site for professional 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
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

With this .htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$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
add comment

4 Answers

up vote 37 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 *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

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

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
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
6  
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
add comment

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

Edit

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 www.example.com to example.com using this method? –  DisgruntledGoat Mar 9 '10 at 21:31
    
In your primary vhost, you have entries for both ServerName and ServerAlias. One has example.com and the other www.example.com. 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
add comment

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

share|improve this answer
add comment

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 www.example.com.

See for example this discussion http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

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 *>
 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>

If you want the "redirect" to be invisible to the user, use 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>

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
add comment

Your Answer

 
discard

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.