As an example, all hits to https://techjourney.net/contact should be redirect to https://techjourney.net/contact/.
Most web server, including the popular Apache HTTPD web server supports mod_rewrite module where rules can be set in .htaccess file in order to redirect to add trailing slash to the URLs that does not already have one.
The following code can be put in .htaccess to redirect URL without trailing slash to URL with trailing slash:
RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !index.php RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301]
Or,
RewriteCond %{REQUEST_URI} !\.[^./]+$ RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.domain.co.uk/$1/ [R=301,L]
Or,
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\..+$ RewriteCond %{REQUEST_URI} !/$ RewriteRule (.*) https://techjourney.net/$1/ [R=301,L]
Or,
RewriteEngine On RewriteBase / RewriteRule ^([a-zA-Z0-9]+)/$ /$1 [L] RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([a-zA-Z0-9]+) RewriteRule ^([a-zA-Z0-9]+)$ /%1/? [R=301,L]
In you’re using CMS or blog such as WordPress that allows custom URL structure for permalinks, especially for search engine optimization (SEO), the above code should come before the block of rewrite conditions and rules for URL customization for the CMS or blog platform.
Brief explaination of the rewrite code to add trailing slash to URL
RewriteEngine On – This line enables the runtime rewriting engine based on mod_rewrite module of Apache.
RewriteBase / – This line sets the current page root directory as base URL for per-directory rewrites.
RewriteCond %{REQUEST_FILENAME} !-f – This line excludes all URLs pointing to existed files from been added with trailing slash again. Directories cannot be excluded as this would exclude the rewrite behavior for existing directories.
RewriteCond %{REQUEST_URI} !index.php – This line is optional, and will excludes a sample URL (in this case, index.php) that users do not want it to be rewritten. Remove this line if not necessary.
RewriteCond %{REQUEST_URI} !\..+$ and RewriteCond %{REQUEST_URI} !\.[^./]+$ – Specify that the URL does not contain any . (dot) to exclude reference to file.
RewriteCond %{REQUEST_URI} !(.*)/$ and RewriteCond %{REQUEST_URI} !/$ – This line determines which URL doesn’t contain a trailing slash
RewriteRule ^(.*)$ http://www.domain.com/$1/ [L,R=301] – This line process URL without trailing slash that has passed conditions set above, by appending a trailing slash and then redirect with 301 or permanent redirect status to the new URL. L mean this is the last line to process and the rewrite process can be terminated. Remember to replace the www.domain.com with your own domain name.
Brief explanation for final set of rewrite rules and rule conditions
RewriteRule ^([a-zA-Z0-9]+)/$ /$1 [L] – This line terminates the trailing slash appending rewrite process if the URL already contains trailing slash.
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([a-zA-Z0-9]+) – This line determines request that does not ends with trailing slash.
RewriteRule ^([a-zA-Z0-9]+)$ /%1/? [R=301,L] – This line append a slash to the end of URI and perform a 301 permanent redirect to the new URL with trailing slash, and terminate the rewrite block.