An .htaccess file also known as an hypertext access file is a directory-level configuration file supported by several web servers, used for configuration of site-access issues, such as URL redirection, URL shortening and Access-security control.

An .htaccess file provides various options for website owners to control the server environment variables and other parameters to enhance functionality of their websites. It is placed in the directories and sub-directories of the Apache document root. When you place an .htaccess file in the apache document root, the .htaccess file is detected and executed by the Apache Web Server.

These .htaccess files can be used to alter the configuration of the Apache Web Server to enable and disable additional functionality and features that the Apache Web Server software has to offer. When you are developing a PHP website and working with PHP and Apache, then you can use an .htaccess file for directory level configuration of Apache web server.

You should only use .htaccess files when you don't have root access to the main Apache server configuration file. An .htaccess file provides many features Some of these features include basic redirects, locking outside access to particular files, or more advanced functions such as content password protection or preventing image hotlinking.

However, use of .htaccess files should be avoided when possible. There are two main reasons to avoid the use of .htaccess files.

The first of these is server performance. When AllowOverride is set to allow the use of .htaccess files, httpd will look in every directory for .htaccess files. Thus, permitting .htaccess files causes a performance issue, whether or not you actually even use them! Also, the .htaccess file is loaded every time a document is requested.

In this article, we will look at some different tips and tricks which we can perform with .htaccess file through various examples.

Requirements

  • A server running CentOS-7 on your system.
  • A static IP Address for your server.
  • A non-root user account with sudo privilege set up on your server.

Install Apache

Before you start to work with the .htaccess file, you will need to install Apache server on your system.

To install Apache, run the following command:

sudo yum install httpd -y

After installing Apache, start the Apache service and enable it to start on boot.

You can do this using the following command:

sudo systemctl start httpd.service sudo systemctl enable httpd.service

Now, you need to allow the default Apache port 80 (HTTP) and 443 (HTTPS) using firewalld.

You can do this by running the following commands:

sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp

Now, reload the firewall service for the changes take effect.

sudo firewall-cmd --reload

Enable .htaccess Files

Before you begin, you will need to allow Apache to read .htaccess files located under the /var/www/html directory.

You can do this by editing httpd.conf file:

sudo nano /etc/httpd/conf/httpd.conf

Find the section `` and change AllowOverride None to AllowOverride All

AllowOverride All

Save and exit.

Now restart Apache to put the change into effect:

sudo systemctl restart httpd

How to Use the .htaccess file with Apache

An .htaccess file is a powerful tool for modifying your Apache configuration on a per-domain and even a per-directory level.

An .htaccess file provides a way to make configuration changes on a per-directory basis. If it is placed in a particular document directory then the directives apply to that directory along with all subdirectories below it. So you don't need to change your Apache config file.

In this section, we will learn how to use .htaccess file with Apache using various examples.

Redirect www to non-www

If you want to redirect users from www to a plain non-www domain, it is possible with htaccess. You will need to create .htaccess file in Apache document root directory.

Change directories to your Document root:

cd /var/www/html

Now, create the .htaccess file.

sudo nano .htaccess

add the following content:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Save and exit the file.

Now, use curl command to ensure that the www domain redirects to the non-www domain:

curl -I http://www.your-domain.com

You should see the following output:

HTTP/1.1 301 Moved Permanently
Date: Mon, 03 May 2016 18:20:53 GMT
Server: Apache/2.4.6 (CentOS)
Location: http://your-domain.com/
Content-Type: text/html; charset=iso-8859-1

Redirect non-www to www

Similarly as above, If you want to redirect users from a plain non-www domain to a www domain, add the following content to your .htaccess file:

sudo nano /var/www/html/.htaccess

add the following content:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Save and exit the file.

Now, use curl command to ensure that the non-www domain redirects to the www domain:

curl -I http://your-domain.com

You should see the following output:

HTTP/1.1 301 Moved Permanently
Date: Mon, 03 May 2016 18:20:53 GMT
Server: Apache/2.4.6 (CentOS)
Location: http://www.your-domain.com/
Content-Type: text/html; charset=iso-8859-1

Redirect http to https

If you want to redirect your http site to https, add the following content to your .htaccess file.

sudo nano /var/www/html/.htaccess

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Now, save and close.

If you want to redirect only a few pages of your site to https, add the following code to your .htaccess file :

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} page1 [OR]
RewriteCond %{REQUEST_URI} page2 [OR]
RewriteCond %{REQUEST_URI} page3
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Now, save and close.

Redirect https to http

Similarly, if you want to redirect your https site to http, add the following content to your .htaccess file.

sudo nano /var/www/html/.htaccess

RewriteCond %{HTTPS} off
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

Now, save and close.

Redirect All Website Pages

If you want to redirect all pages from domain1.com to domain2.com, add the following content to your .htaccess file:

sudo nano /var/www/html/.htaccess

add the following content:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain1.com$ [OR]
RewriteCond %{HTTP_HOST} ^domain1.com$
RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L]

Save and exit the file.

Now, use curl command to check whether domain redirection working or not:

curl -I http://www.domain1.com

You should get a 301 Moved Permanently response, that shows you new domain redirect location.

Deny File Type Access

If you want to prevent the users accessing a specific file type like index.php and multiple file types like htpasswd, ini, php, sh, and jpeg then add the following content to your .htaccess file:

sudo nano /var/www/html/.htaccess

# prevent viewing of a specific file

order allow,deny deny from all

# multiple file types

order allow,deny deny from all

 

Save and exit the file.

Deny visitors by IP address and domains

If you want to block the users from IP 192.168.1.2 and 192.168.1.3, add the following code to your .htaccess file:

sudo nano /var/www/html/.htaccess

Order allow,deny
deny from 255.0.0.0
deny from 255.0.0.1
allow from all

Save and exit the file.

Similarly, you can block users from domain1.com and domain2.com by adding the following content to your .htaccess file:

sudo nano /var/www/html/.htaccess

RewriteEngine on
RewriteCond %{HTTP_REFERER} domain1.com [NC,OR]
RewriteCond %{HTTP_REFERER} domain2.com [NC,OR]
RewriteRule .* - [F]

Save and exit the file.

Enable SSI on Websites with .htaccess

SSI also called "Server Side Includes" are directives that are placed in HTML pages, and evaluated on the server while the pages are being served.

While standard HTML files are fine for storing conttent, it is very useful to be able to create some content dynamically. This can be done with SSI.

To do this, you will need to enable them in your .htaccess file. Should you wish to enable it for .html files you need to add the following lines to your .htaccess file:

sudo nano /var/www/html/.htaccess

AddHandler server-parsed .html

Redirect Users to Maintenance Page

If your website is down for maintenance and you want to notify all your users that need to access your websites, then for such cases you can add the following lines to your .htaccess websites that allow only admin access and replace the site pages having links to any .css, .gif, .js etc.

sudo nano /var/www/html/.htaccess

RewriteCond %{REQUEST_URI} !^/admin/ [NC]
RewriteCond %{REQUEST_URI} !^((.*).css|(.*).js|(.*).png) [NC]
RewriteRule ^(.*)$ /ErrorDocs/Maintainence_Page.html
[NC,L,U,QSA]

The above lines check if the requested URL contains any request for any admin page or any request to ".png, .js, .css" pages and for any such requests it replaces that page with "ErrorDocs/Maintainence_Page.html".

Redirect Users to Custom Error Pages

If you want to show custom error pages when a 404 error occurs, then add the following content to your .htaccess file:

sudo nano /var/www/html/.htaccess

ErrorDocument 404 /404.php

And you can also extend this for other error pages to:

ErrorDocument 400 /400.html
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 504 /504.html

Save and exit the file.

Use .htaccess to prevent Hacking

If you want to secure your Apache website, you can add the following codes to your .htaccess file to prevent some common hacking techniques by detecting malicious URL patterns.

sudo nano /var/www/html/.htaccess

RewriteEngine On

# proc/self/environ? no way! RewriteCond %{QUERY_STRING} proc/self/environ [OR]

# Block out any script trying to set a mosConfig value through the URL RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]

# Block out any script trying to base64_encode crap to send via URL RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]

# Block out any script that includes a tag in URL RewriteCond %{QUERY_STRING} (|%3E) [NC,OR]

# Block out any script trying to set a PHP GLOBALS variable via URL RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]

# Block out any script trying to modify a _REQUEST variable via URL RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})

# Send all blocked request to homepage with 403 Forbidden error! RewriteRule ^(.*)$ index.php [F,L]

Save and exit the file.

Setting Time Zones

You can use .htaccess file to set the timezone of the Apache server. You can do this by setting a global environment variable ‘TZ’ in the list of global environment variables that are provided by the server to each of the hosted websites for modification.

Add the following lines to your .htaccess file to set the timezone of the Server.

sudo nano /var/www/html/.htaccess

SetEnv TZ Australia/Melbourne

Save and exit the file.

Conclusion

In this tutorial, we have explained how to work with the .htaccess file including various examples. I hope you find it easy to work with the .htaccess file in the future and can successfully use it to secure and optimize your web server in production environment.