4

For aesthetic reasons (I prefer when there is a strict one-to-one mapping between URL and pages), I do not like the fact that http://www.example.com/index.html and http://www.example.com/ yield the same content with two different URLs. I would like to have http://www.example.com/ as the canonical one.

The obvious solution:

Redirect permanent /index.html /

is wrong (endless loop).

A better solution? It seems surprisingly difficult.

6 Answers 6

2

Try a RewriteCond from mod_rewrite:

RewriteEngine On
RewriteCond %{QUERY_STRING} !^/$
RewriteRule /index.html / [R]

This says if the query string is not / then rewrite /index.html as / (should not loop).

1
  • Thanks, clearly the best solution (I adapted it a bit and, since I do not have enough points to edit your answer, I created mine).
    – bortzmeyer
    Aug 29, 2010 at 21:15
2

My solution (which seems to work so I accepted it), inspired from PP's response, is:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/index\.html$
RewriteRule .* http://www.example.com/ [R=302,L]

Any non-modrewrite solution? I had to activate a new Apache module, which I try to avoid.

1

RedirectMatch ^/index.html$ http://www.example.com/

1
  • I tried and it loops endlessly.
    – bortzmeyer
    Aug 25, 2010 at 9:33
1

Why not set DirectoryIndex to something else - e.g., unpredictable.html, and name your index file similarly?

DirectoryIndex unpredictable.html
Redirect permanent /index.html http://yoursite/

You need never expose the chosen DirectoryIndex value.

Note that the last argument to Redirect needs to be a full URL, not just a path fragment.

1
  • Nice and clever idea but, still, if someone uses the /unpredictable.html URL, it will get to the content of the index page.
    – bortzmeyer
    Aug 25, 2010 at 9:43
1

A non mod_rewrite solution… Actually joschi nearly had it but for some (unclear to me) reason you have to kludge around the endless loop:

RedirectMatch permanent ^/index\.html$ http://www.example.com/
AliasMatch ^/$ /var/www/index.html
0
RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/index\.html$
RewriteRule .* http://www.example.com/ [R=302,L]

perfect solution

1
  • How is this any different than the accepted answer?
    – chicks
    Jan 3, 2017 at 13:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .