• This email address is being protected from spambots. You need JavaScript enabled to view it.
.htaccess for SEO

User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active

 Using .htaccess to improve SEO.


In my previous article where I showed how to SEO optimize a Joomla instalment, link here: SEO for Joomla. The article became quite large and I could not dive deeper into the SEO aspect for .htaccess therefor I will dive deeper into .htaccess. When it comes to web hosting or any kind of website .htaccess will be very important in terms of security what also ties into a higher SEO score. The .htaccess file has been around since the dawn of time when it comes to HTTP/WWW protocols any can change the behaviour of your site. While configuring an Apache server through the http.conf itself it is rarely you will have access to that file on shared hosting solutions. But do not worry the .htaccess file is almost as powerful at the http.conf file but it can be tricky to work with. However in the long run understanding, this file will make your life much easier, and your website much better in the long run. For Joomla users I have a pre-made .htaccess file you can download, the website you current viewing is configured with the same file. --> Joomla .htaccess File <-- Remember to rename to .htaccess by removing the .txt extension when placing this in your ROOT.

A guide to the .htaccess file below with some pointers and configurations that might work for you, be sure to make a backup of your original file! While working on my SEO score I found numerous articles that cover the subject however with my previous article more information is needed. Before we start to ensure that if you make an edit to check with your hosts help files there are small variations per host this can lead to errors. I've added some snippets you will find handy to use, make sure to configure them according to your taste and test results.

Google PageSpeed Module.

The Google PageSpeed Module is a server-side open-source module that is used by most 3rd part hosting service like GoDaddy. And is enabled through your .htaccess file and improves the performance of JavaScript, HTML, CSS, and, JPG/PNG images. mod_PageSpeed as it is also known works on Pache and Nginx servers. For 3rd party, hosting check the provider hosting FAQ. For those who manage their web servers, Google offers a wide range of install packages.

Debian & Ubuntu.

sudo dpkg -i mod-pagespeed-*.deb
sudo apt-get -f install

CentOS & Fedora.

sudo yum install at  # if you do not already have 'at' installed
sudo rpm -U mod-pagespeed-*.rpm


Visit the following page: Google PageSpeed Module Packages.

Adding Google PageSpeed Module functionality to the .htaccess file.

Below are a copy and paste of the PageSpeed modules for this website. This main purpose here is to clean HTML and CSS as well as moving the CSS to the header for optimized loading. Important to note here that some hosting services you will need to add PageSpeed functions per line in your .htaccess file or they will not work properly.

## Google Page Speed##
<IfModule pagespeed_module>
ModPagespeed on
ModPagespeedEnableFilters extend_cache
ModPagespeedEnableFilters move_css_to_head
ModPagespeedEnableFilters combine_css
ModPagespeedEnableFilters collapse_whitespace
ModPagespeedEnableFilters elide_attributes
ModPagespeedEnableFilters remove_comments

Snippets for.htaccess.

Below is a selection of code snippets you can use in your .htaccess file. Snippets include security mods, redirects, and, rewrites.

Redirect Everyone Except IP address to an alternate page.

ErrorDocument 403 http://www.yourdomain.com/
Order deny,allow
Deny from all
Allow from

#301 Redirects for .htaccess

#Redirect a single page:
Redirect 301 /pagename.php http://www.domain.com/pagename.html

#Redirect an entire site:
Redirect 301 / http://www.domain.com/

#Redirect an entire site to a sub folder
Redirect 301 / http://www.domain.com/subfolder/

#Redirect a sub folder to another site
Redirect 301 /subfolder http://www.domain.com/

#This will redirect any file with the .html extension to use the same filename but use the .php extension instead.
RedirectMatch 301 (.*)\.html$ http://www.domain.com$1.php

#You can also perform 301 redirects using rewriting via .htaccess.

#Redirect from old domain to new domain
RewriteEngine on
RewriteBase /
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

#Redirect to www location
RewriteEngine on
RewriteBase /
rewritecond %{http_host} ^domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc]

#Redirect to www location with subdirectory
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} domain.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/directory/index.html [R=301,NC]

#Redirect from old domain to new domain with full path and query string:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*) http://www.newdomain.com%{REQUEST_URI} [R=302,NC]

#Redirect from old domain with subdirectory to new domain w/o subdirectory including full path and query string:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/subdirname/(.*)$
RewriteRule ^(.*) http://www.katcode.com/%1 [R=302,NC]

#Rewrite and redirect URLs with query parameters (files placed in the root directory)

Original URL:

Desired destination URL:

.htaccess syntax:

RewriteEngine on
RewriteCond %{QUERY_STRING} id=1
RewriteRule ^index\.php$ /path-to-new-location/? [L,R=301]
Redirect URLs with query parameters (files placed in subdirectory)

Original URL:

Desired destination URL:

.htaccess syntax:

RewriteEngine on
RewriteCond %{QUERY_STRING} id=1
RewriteRule ^sub-dir/index\.php$ /path-to-new-location/? [L,R=301]
Redirect one clean URL to a new clean URL

Original URL:

Desired destination URL:
.htaccess syntax:

RewriteEngine On
RewriteRule ^old-page/?$ $1/new-page$2 [R=301,L]
Rewrite and redirect URLs with query parameter to directory based structure, retaining query string in URL root level

Original URL:

Desired destination URL:

.htaccess syntax:

RewriteEngine On
RewriteRule ^([^/d]+)/?$ index.php?id=$1 [QSA]
Rewrite URLs with query parameter to directory based structure, retaining query string parameter in URL subdirectory

Original URL:
Desired destination URL:
.htaccess syntax:

RewriteEngine On
RewriteRule ^/?category/([^/d]+)/?$ index.php?category=$1 [L,QSA]
Domain change – redirect all incoming request from old to new domain (retain path)

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example-old\.com$ [NC]
RewriteRule ^(.*)$ http://www.example-new.com/$1 [R=301,L]
If you do not want to pass the path in the request to the new domain, change the last row to:

RewriteRule ^(.*)$ http://www.example-new.com/ [R=301,L]

#From blog.oldsite.com -> www.somewhere.com/blog/
retains path and query, and eliminates xtra blog path if domain is blog.oldsite.com/blog/
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI}/ blog
RewriteRule ^(.*) http://www.somewhere.com/%{REQUEST_URI} [R=302,NC]
RewriteRule ^(.*) http://www.somewhere.com/blog/%{REQUEST_URI} [R=302,NC]

Serve all .pdf files on your site using .htaccess and mod_rewrite with the PHP script.

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.+)\.pdf$ /cgi-bin/pdf.php?file=$1 [L,NC,QSA]
Rewrite to www
RewriteCond %{REQUEST_URI} !^/(robots\.txt|favicon\.ico|sitemap\.xml)$
RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

Rewrite to www dynamically.

RewriteCond %{REQUEST_URI} !^/robots\.txt$ [NC]
RewriteCond %{HTTP_HOST} !^www\.[a-z-]+\.[a-z]{2,6} [NC]
RewriteCond %{HTTP_HOST} ([a-z-]+\.[a-z]{2,6})$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R=301,L]

Implementing a Caching Scheme with .htaccess

# year
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$">
Header set Cache-Control "public"
Header set Expires "Thu, 20 Apr 2010 20:00:00 GMT"
Header unset Last-Modified
#2 hours
<FilesMatch "\.(html|htm|xml|txt|xsl)$">
Header set Cache-Control "max-age=7200, must-revalidate"
<FilesMatch "\.(js|css)$">
SetOutputFilter DEFLATE
Header set Expires "Thu, 20 Apr 2010 20:00:00 GMT"

Password Protect a single file.

<Files login.php>
AuthName "Prompt"
AuthType Basic
AuthUserFile /web/askapache.com/.htpasswd
Require valid-user

Password Protect multiple files.

<FilesMatch "^(private|phpinfo).*$"> AuthName "Development" AuthUserFile /.htpasswd AuthType basic Require valid-user </FilesMatch>
Prevent hotlinking.
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain\.com/.*$ [NC]
RewriteRule \.(gif|jpg|swf|flv|png)$ http://www.yourdomain.com/feed.

Partial Source Code for 301 rewrites: https://gist.github.com/ScottPhillips/1721489

AMD Ryzen 3700X overclocking guide intro banner

Ryzen 7 overclocking the 3700X

AMD Ryzen 7 3700X overclocking guide. This is an easy to use and comprehensive overclocking guide for the AMD Ryzen 7 3700X with a wide
Intel i5 100600K overclocking guide banner

Intel i5 overclocking the 10600K.

Intel i5 overclocking the 10600K on a Z490 Motherboard. This is easy and illustrated overclocking guide for the i5 10600K using a mid-range MSI Z490
AMD Ryzen 2600 overclocking guide intro banner

Ryzen 5 overclocking the 2600.

AMD Ryzen 5 2600 overclocking guide. This is a comprehensive and easy to use guide with illustrations to overclock the Ryzen 5 2600 CPU from
DDR RAM Overclocking Banner

DDR RAM Overclocking Terminology FAQ

DDR RAM Overclocking Terminology FAQ This Terminology FAQ covers overclocking for DDR RAM for both Intel and AMD platform and adds a reference material for various