Add a trailing slash to requested urls

Description of the problem

Some search engines remove the trailing slash from urls that look like directories – e.g. Yahoo does it. But – it could result into duplicated content problems when the same page content is accessible under different urls. Apache gives some more information in the Apache Server FAQ.

Let’s have a look at an example: is indexed in Yahoo as – which would result in two urls with the same content.


The solution was to create a .htaccess rewrite rule that adds the trailing slashes to these urls.

Example – redirect all urls that doesn’t have a trailing slash to urls with a trailing slash

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !example.php
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$$1/ [L,R=301]

Explanation of this add trailing slash .htaccess rewrite rule

The first line tells Apache that this is code for the rewrite engine of the mod_rewrite module of Apache.
The 2nd line sets the current directory as page root. But the interesting part is following now:

RewriteCond %{REQUEST_FILENAME} !-f makes shure that files that are existing will not get a slash added. You shouldn’t do the same with directories since this would exlude the rewrite behaviour for existing directories.

The line RewriteCond %{REQUEST_URI} !example.php exludes a sample url that shouldn’t be rewritten. This is just an example – if you don’t have any file or url that shouldn’t be rewritten, remove this line.

The condition RewriteCond %{REQUEST_URI} !(.*)/$ finally fires when a urls doesn’t contain a trailing slash – this is all what we want. Now we need to redirect these url with the trailing slash:

RewriteRule ^(.*)$$1/ [L,R=301] does the 301 redirect to the url with the trailing slash appended for us. You should replace with your url. Make shure that you stick with the right domain name; if unshure, have a look at this article.