I have a small number of static sites where I simply want to hide the .html extension:
- the url
/foo
fetches the static file/foo.html
- the browser still displays the url
/foo
The client can then send out bookmarks in the style mydomain.com/foo
rather than mydomain.com/foo.html
.
It sounds very simple, and I've used mod_rewrite
happily before (say with WordPress or for redirects), but this is proving much harder to crack that I thought. Perhaps I'm missing something really obvious, but I can't find a solution anywhere and I've been at it all day!
We run our own server, so this can go wherever is the best place.
Addendum
The solution checked below worked fine. Then after running the site awhile I noticed two problems:
all pages began to appear unstyled. I reloaded, cleared the cache, etc., but still no-style. I've had this trouble before, and can't locate the source.
There's a directory AND an html file named 'gallery', so the /gallery link shows a directory listing instead of the html file. I should be able to sort that one, but further tips welcome :-)
The previous answers don't check if the requested path is a directory.
Here is the full rewrite condition which doesn't rewrite, if requested path is a directory (as stated by the original question):
To be SEO friendly and avoid double content, redirect the .html urls:
If you need the same for scripts take a look here: How can I use .htaccess to hide .php URL extensions?
To remove
.html
extension from.*.html
requests, you can use the following script inroot/.htaccess
:The accepted solution do not works when the website is configured with a virtual host / document root.
There is the solution I used:
Here is an example which allows us to store the file on disk as:
But in the browser, refer to it as
To make this work for you, I think you would just need to modify it a bit to match your existing requests, and check for an actual file in place with the
.html
extension.Try this rule:
This will rewrite all requests that can be mapped to an existing file when appending a
.html
.Wow, I have seldom seen such an issue for which there exists so many "solutions" on the web, where people just throw up what "works for them" but for which few take time to read the documentation to figure out what it does. Many of the solutions given here don't work for virtual hosts, for example.
After much cross-referencing and reading, I want to contribute my own solution that "works for me". Hopefully it works for you, too. I didn't create it from scratch; I was inspired by all the other contributions (even though most of them did not "work for me" without modification).
The
[R]
flag by default does a temporary (302) redirect; if you want a permanent redirect, useR=301
in place ofR
.