Redirect URL within Apache VirtualHost?

268,355

Solution 1

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 using the Redirect directive from mod_alias:

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

Solution 2

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.

Solution 3

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.

Solution 4

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:
268,355

Related videos on Youtube

DisgruntledGoat
Author by

DisgruntledGoat

I'm a web developer and programmer from the UK. I'll fill this out more when I can be bothered; really I'm just trying to get the autobiography badge.

Updated on September 17, 2022

Comments

  • DisgruntledGoat
    DisgruntledGoat over 1 year

    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.

  • joschi
    joschi about 14 years
    You do not need mod_rewrite for this. Use mod_alias and its RedirectPermanent directive instead.
  • DisgruntledGoat
    DisgruntledGoat about 14 years
    @joschi: What would be the advantage of that? Is it faster?
  • DisgruntledGoat
    DisgruntledGoat about 14 years
    Can you explain a bit further? How would I redirect www.example.com to example.com using this method?
  • joschi
    joschi about 14 years
    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.
  • DisgruntledGoat
    DisgruntledGoat about 14 years
    I want to do a redirect though, not just an alias.
  • Warner
    Warner about 14 years
    Then joshchi's recommendation may be a good approach for you. Seems like hairs are being split at this point.
  • Omer Eli
    Omer Eli about 12 years
    For some strange reason Redirect 301 .. did not work for us. We had to use the RewriteRule option.
  • nickgrim
    nickgrim over 10 years
    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.
  • Cees Timmerman
    Cees Timmerman over 9 years
    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"!
  • akshayb
    akshayb over 9 years
    works fine (the second one) but it doesn't change url. still shows www in the url ?
  • jtpereyda
    jtpereyda over 7 years
    It is safer to omit the '301' unless you really want a permanent redirect. The default is 302 Found, which would work better for a lot of people. See jacquesmattheij.com/301-redirects-a-dangerous-one-way-street