Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove ".html" from URL via .htaccess for a WordPress website

Background information:

I've searched stackoverflow for a specific solution and couldn't find one that fixed my situation. Thanks in advance for any help you can offer. Your knowledge is appreciated.

I've decided to accept a contract to "convert" (in the client's words) a Joomla site into a WordPress site. Everything is going along smoothly, except that the Joomla site links to .html files, both in its navigation and in the content of 100+ posts.

Instead of going through each post one-by-one and updating the links or running a SQL command to remove ".html" from URLs, I've decided to put the pressure on .htaccess, with which I am somewhat comfortable.


What I'm trying to do ↓

In WordPress, I have custom permalinks enabled, and it is as follows: /%category%/%postname%

Here's an example of what one of the old URLs in the posts looks like:

http://the-site.com/category/the-webpage.html

I need the htaccess file to tell the webserver to remove the .html so the user, after visiting "http://the-site.com/the-webpage.html" is instead sent to:

http://the-site.com/category/the-webpage

I'm setting up the page stubs to follow the file name of the Joomla pages, so http://the-site.com/category/the-webpage will work.


My question:

Can you help me discover the solution to removing .html from the URL when someone visits the site, even if the HTML file doesn't exist on the server?


Here's how the .htaccess file looked before I made changes:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Here's the latest .htaccess file as of 5:35pm Eastern:

# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.html$
RewriteRule ^(.*)\.html$ $1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

The ↑latest .htaccess changes work. Thanks Tim!

like image 441
z0mn Avatar asked Jun 27 '10 20:06

z0mn


3 Answers

This will work to force an external redirection to your new URLs, but this may not be ideal for your situation. I'm still trying to think if there's a way to keep the redirection internal and update the variable that WordPress uses to determine which page to serve up, but so far I haven't thought of anything that would work.

Entire .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.html$
RewriteRule ^(.*)\.html$ $1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
like image 129
Tim Stone Avatar answered Nov 06 '22 17:11

Tim Stone


You want to use a URL rewrite

RewriteEngine On
RewriteRule ^(.*)\.html$ $1
like image 2
Elle H Avatar answered Nov 06 '22 16:11

Elle H


This should do it. It will rewrite a request to site.com/category/whatever.html to site.com/category/whatever. it shouldn't be dependent upon the requested file existing.

    <Directory /var/www/category>
        RewriteEngine on
        RewriteRule (.*)\.html$ /category/$1
    </Directory>

This is the format for apache2.conf or virtual host files. Not sure if you use the command in .htaccess. It's best to take care of it in the server conf, if you can, as that is only parsed once, on server startup, and htaccess is parsed on each request.

like image 1
JAL Avatar answered Nov 06 '22 18:11

JAL