Anchors and Cruft-Free URLs
I’m trying to clean up some URLs using mod_rewrite. I have .shtml files on the server, but I want browsers to be able to access them without the file extension. And if the browser does send a URL with .shtml, it should be redirected to the URL without the file extension. I have this much working, and here are the contents of the .htaccess file:
RewriteEngine On RewriteBase / # remove .shtml; use THE_REQUEST to prevent infinite loops RewriteCond %{THE_REQUEST} ^GET\ (.*)\.shtml\ HTTP RewriteRule (.*)\.shtml$ $1 [R=301] # remove index RewriteRule (.*)/index$ $1/ [R=301] # remove slash if not directory RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} /$ RewriteRule (.*)/ $1 [R=301] # add .shtml to access file, but don't redirect RewriteCond %{REQUEST_FILENAME}.shtml -f RewriteCond %{REQUEST_URI} !/$ RewriteRule (.*) $1\.shtml [L]
The problem is that this doesn’t work when the URL has an anchor. If I type:
http://www.example.com/foo#bar
into the browser, it works fine. But:
http://www.example.com/foo.shtml#bar
gets redirected to:
http://www.example.com/foo
instead of:
http://www.example.com/foo#bar
As far as I know, #bar stays in the browser; it isn’t sent to the server. So I don’t think there’s any way to preserve it using the rewrite rules. Is there any way to get the browser to tack on the #bar after it gets the 301 from the server?