• Get In Touch
May 16, 2016

How to Use .htaccess With Apache

Need Hosting? Try ours, it's fast, reliable and feature loaded with support you can depend on.
View Plans

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.

Need Hosting? Try ours, it's fast, reliable and feature loaded with support you can depend on.
View Plans

Share this Article!

Related Posts

Node.js Authentication – A Complete Guide with Passport and JWT

Node.js Authentication – A Complete Guide with Passport and JWT

Truth be told, it’s difficult for a web application that doesn’t have some kind of identification, even if you don’t see it as a security measure in and of itself. The Internet is a kind of lawless land, and even on free services like Google’s, authentication ensures that abuses will be avoided or at least […]

Node.js and MongoDB: How to Connect MongoDB With Node

Node.js and MongoDB: How to Connect MongoDB With Node

MongoDB is a document-oriented NoSQL database, which was born in 2007 in California as a service to be used within a larger project, but which soon became an independent and open-source product. It stores documents in JSON, a format based on JavaScript and simpler than XML, but still with good expressiveness. It is the dominant […]

Using MySQL with Node.js: A Complete Tutorial

Using MySQL with Node.js: A Complete Tutorial

Although data persistence is almost always a fundamental element of applications, Node.js has no native integration with databases. Everything is delegated to third-party libraries to be included manually, in addition to the standard APIs. Although MongoDB and other non-relational databases are the most common choice with Node because if you need to scale an application, […]

Node.Js Vs Django: Which Is the Best for Your Project

Node.Js Vs Django: Which Is the Best for Your Project

Django and NodeJs are two powerful technologies for web development, both have great functionality, versatile applications, and a great user interface. Both are open source and can be used for free. But which one fits your project best? NodeJs is based on JavaScript, while Django is written in Python. These are two equally popular technologies […]

Nodejs Vs PHP:  Which Works Best?

Nodejs Vs PHP: Which Works Best?

Before getting into the “battle” between Node.js and PHP we need to understand why the issue is still ongoing. It all started with the increased demand for smartphone applications, their success forcing developers to adapt to new back-end technologies that could handle a multitude of simultaneous requests. JavaScript has always been identified as a client-side […]