5

Something like this works for the index page:

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

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

So a url like this:

http://example.com gets forwarded to 
http://www.example.com

but this doesn't work:

http://example.com/robots.txt

I have also tried the following in .htaccess with the same results:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=permanent,L]

Please help me resolve this.

Full configuration:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

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

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

ProxyPass / balancer://example/ stickysession=JSESSIONID|jsessionid
ProxyPassReverse / balancer://example/ stickysession=JSESSIONID|jsessionid
ProxyPreserveHost On

<Proxy balancer://example>
BalancerMember http://host1.example.com:8080/ route=tomcat1
BalancerMember http://host2.example.com:8080/ route=tomcat2
</Proxy>
</VirtualHost>

robots.txt is located on each of the tomcat servers.

Prashant
  • 59
  • 1
  • 1
  • 3

4 Answers4

6

I always use a negated pattern, so anything that matches the Virtual Host, but doesn't match the canonical address, will be redirected.

RewriteCond %{HTTP_HOST} !^www.example.com [nocase]
RewriteRule ^/(.*)$ http://www.example.com/$1 [redirect=permanent,nocase,last]

This has the benefit of an unlimited and unspecified number of ServerAlias directives (eg, *.example.net, *.example.org, *.example.asia etc) to all redirect correctly to www.example.com)

fukawi2
  • 5,327
  • 3
  • 30
  • 51
  • For some reason apache looks for this file in /etc/apache2/htdocs and throws a 'File does not exist error' in the error log. – Prashant Jul 05 '13 at 00:31
  • 1
    What file? I put this inside the VirtualHost block, and don't forget `RewriteEngine On` – fukawi2 Jul 05 '13 at 04:24
  • In my case the problem is not with the root domain redirect. The problem occurs only for sub urls. – Prashant Jul 05 '13 at 15:49
  • That's what the `(.*)` and the `$1` deals with. It's called a back-reference and will redirect to the same path as the original request. eg, `example.com/about-us` will be redirected to `www.example.com/about-us` – fukawi2 Jul 05 '13 at 23:41
6

I personally have always found a simple 301 redirect to be more than adequate for this purpose:

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

It's simple, easy to read/remember, and get's the job done right.

This is actually copied from my production web server, so I know it works.

There are docs on Apache redirects available here: http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

And I just tested, and typing http://oakalleyit.com/user redirects correctly to http://www.oakalleyit.com/user

Soviero
  • 4,306
  • 7
  • 34
  • 59
2

This has always worked for me:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.co\.uk$ [NC]
RewriteRule ^(.*)$ http://www.example.co.uk/$1 [R=301,L]

I think your missing the $ on the condition perhaps?

More info can be found here: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html http://httpd.apache.org/docs/current/mod/mod_rewrite.html

  • Just noticed the link points to a non maintained version of Apache, sorry. This may also help, http://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect – OneLogicalMyth Jul 04 '13 at 23:13
  • You can always edit your answer. – Michael Hampton Jul 04 '13 at 23:18
  • I felt the information was still relevant as, the information contained on the page still seems to be valid to me. It is also shows how I do my redirection at the moment as per my answer. Did think about removing it but couldn't make up my mind :-) – OneLogicalMyth Jul 04 '13 at 23:27
  • Thanks for replying but this didn't work. My underlying configuration is a bit more complicated than this ( I updated it above ). I use apache mod_proxy_balancer to forward requests to two tomcat servers. – Prashant Jul 04 '13 at 23:53
0

The Apache documentation page Redirecting and Remapping with mod_rewrite says:

Canonical Hostnames

Description: The goal of this rule is to force the use of a particular hostname, in preference to other hostnames which may be used to reach the same site. For example, if you wish to force the use of www.example.com instead of example.com, you might use a variant of the following recipe.

Solution:

The very best way to solve this doesn't involve mod_rewrite at all, but rather uses the Redirect directive placed in a virtual host for the non-canonical hostname(s).

<VirtualHost *:80>
  ServerName undesired.example.com
  ServerAlias example.com notthis.example.com
  Redirect "/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
</VirtualHost>

You can alternatively accomplish this using the <If> directive:

<If "%{HTTP_HOST} != 'www.example.com'">
  Redirect "/" "http://www.example.com/"
</If>
Teemu Leisti
  • 123
  • 7