
The .htaccess file is a powerful configuration file used on Apache-based web servers to manage and modify settings at the directory level. By modifying .htaccess file, you can control many aspects of your website’s behavior without needing to alter server-wide settings.
Below are 25 essential .htaccess tricks and tips that can help improve your site’s security, performance, and SEO.
1. Redirect HTTP to HTTPS
If your site supports HTTPS, it’s important to redirect all traffic from HTTP to HTTPS to improve security and boost search engine rankings.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
2. Set a Custom 404 Error Page
First, you need to create the HTML file that will serve as your custom 404 error page under your website’s document root directory, then add this line to specify your custom 404 page. This page helps retain users who land on non-existent pages.
ErrorDocument 404 /404.html
3. Force File Downloads
To force a file to download instead of displaying it in the browser, use this directive:
<FilesMatch ".(pdf|zip|doc)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
This will make files like PDFs or ZIPs download automatically when accessed.
4. Block Specific IP Addresses
To block users from certain IP addresses, add the following lines:
<Limit GET POST>
order allow,deny
deny from 123.456.789.000
allow from all
</Limit>
5. Redirect Old URLs to New Ones
If you have changed the structure of your site, redirecting old URLs to new ones is critical for maintaining SEO.
Redirect 301 /old-url.html https://yourdomain.com/new-url.html
This sends a permanent redirect (301) from the old URL to the new one.
6. Password Protect a Directory
You can protect directories with a password by adding this to your .htaccess file:
AuthType Basic AuthName "Restricted Area" AuthUserFile /path/to/.htpasswd Require valid-user
Create a .htpasswd file for storing usernames and passwords.
htpasswd -c .htpasswd username
7. Disable Directory Browsing
By default, users may be able to see a list of files in a directory without an index page, but you can prevent this by disabling directory browsing.
Options -Indexes
This will show a 403 Forbidden error instead of the file list.
8. Restrict Access to .htaccess File
To protect your .htaccess file from unauthorized access, add this rule:
<Files .htaccess>
order allow,deny
deny from all
</Files>
This ensures that no one can view the contents of your .htaccess file.
9. Block Hotlinking
Hotlinking occurs when another site directly links to your images, consuming your bandwidth. To prevent this, use:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www.)?yourdomain.com [NC]
RewriteRule .(jpg|jpeg|png|gif)$ - [F]
Replace yourdomain.com with your domain name.
10. Custom 403 Forbidden Page
Like custom 404 pages, you can create a custom 403 Forbidden page.
ErrorDocument 403 /403.html
This page appears when users try to access restricted content.
11. Prevent Image Hotlinking With a Warning Image
You can replace hotlinked images with a custom warning image:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www.)?yourdomain.com [NC]
RewriteRule .(jpg|jpeg|png|gif)$ https://yourdomain.com/warning.jpg [R,L]
Replace warning.jpg with your custom warning image.
12. Set Cache-Control Headers
To improve site performance, use .htaccess to set cache control for static resources like images and scripts:
<FilesMatch ".(jpg|jpeg|png|gif|js|css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
This tells browsers to cache these files for 30 days (2592000 seconds).
13. Deny Access to Certain File Types
You may want to block access to certain file types, such as configuration files:
<FilesMatch ".(ini|log|conf)$">
Order allow,deny
Deny from all
</FilesMatch>
14. Enable Gzip Compression
Gzip compression reduces the size of files sent to the browser, improving load times:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE application/javascript
</IfModule>
15. Redirect to a Maintenance Page
If your site is undergoing maintenance, you can redirect all visitors to a specific maintenance page:
RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteRule ^(.*)$ /maintenance.html [R=307,L]
Replace maintenance.html with your maintenance page URL.
16. Limit File Upload Size
To limit the file upload size on your site, use this rule:
php_value upload_max_filesize 10M php_value post_max_size 10M
17. Redirect Non-WWW to WWW
To ensure all traffic is directed to the www version of your domain:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
This will redirect visitors from yourdomain.com to www.yourdomain.com.
18. Redirect WWW to Non-WWW
If you prefer the non-www version of your domain, use this code:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www. [NC]
RewriteRule ^(.*)$ https://yourdomain.com/ [L,R=301]
This redirects www.yourdomain.com to yourdomain.com.
19. Prevent Access to PHP Files in Specific Folders
You can block access to PHP files in specific directories (like uploads) for security:
<Directory "/path/to/uploads">
<Files "*.php">
Order Deny,Allow
Deny from all
</Files>
</Directory>
Replace /path/to/uploads with the actual folder path.
20. Prevent Image Directory Access
To block access to your image folder while still allowing images to load on your site:
<Directory "/path/to/images">
Order Deny,Allow
Deny from all
</Directory>
21. Block Specific User Agents
If certain bots or scrapers are abusing your site, you can block them:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} badbot [NC]
RewriteRule .* - [F,L]
Replace badbot with the user agent you want to block.
22. Restrict Access by Country
To block visitors from specific countries, you need access to a list of IP ranges for those countries.
Here’s an example for blocking certain IP ranges:
<Limit GET POST>
order allow,deny
deny from 123.456.789.
allow from all
</Limit>
You’ll need to replace the IP ranges with those specific to the countries you want to block.
23. Enable Cross-Origin Resource Sharing (CORS)
To allow CORS for resources like fonts or images, use:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
24. Prevent SQL Injection
You can block common SQL injection attempts:
RewriteEngine On
RewriteCond %{QUERY_STRING} (<|%3C)(script|SELECT|INSERT|UPDATE|DELETE|DROP|UNION|;|--) [NC]
RewriteRule .* - [F]
25. Allow Only Certain File Types in Uploads
You can restrict which file types can be uploaded to your site.
<FilesMatch ".(php|cgi|pl|py)$">
Order Deny,Allow
Deny from all
</FilesMatch>
26. Enable File Access Logs
If you want to track access to specific files for auditing or monitoring purposes, you can enable logging for certain file types:
SetEnvIf Request_URI ".(pdf|doc|mp3)$" requested_file CustomLog /path/to/logfile.log combined env=requested_file
This will log access to .pdf, .doc, and .mp3 files in a separate log file.
27. Custom 500 Internal Server Error Page
If your server encounters an internal error, you can display a custom error page to provide a better user experience.
ErrorDocument 500 /500.html
This way, instead of showing the default server error message, users will see a more user-friendly message that you have customized.
28. Prevent Access to Backup and Source Files
Backup files (like .bak, .old) or source files (like .log) are sometimes left on servers, exposing sensitive information.
To prevent access to these files, add this:
<FilesMatch ".(bak|old|log|sql)$">
Order allow,deny
Deny from all
</FilesMatch>
29. Limit Access by Referrer
You can control which sites are allowed to refer traffic to your website. For example, to block access to your site when the referrer comes from a specific domain.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https://www.baddomain.com [NC]
RewriteRule .* - [F]
Replace baddomain.com with the site you want to block as a referrer.
30. Limit Access to Admin Area by IP Address
If your website has an admin panel (like /admin or /wp-admin), it’s wise to limit access to this section based on IP address for security reasons:
<Files "admin.php">
Order Deny,Allow
Deny from all
Allow from 123.456.789.000
</Files>
Replace 123.456.789.000 with your IP address. Only this IP will be allowed to access admin.php.
31. Custom 401 Unauthorized Error Page
When users attempt to access a restricted page without proper authentication, you can present a custom 401 Unauthorized error page instead of the default server message:
ErrorDocument 401 /401.html
32. Redirect Based on Language Preference
If you have a multilingual website, you can redirect users to the appropriate language version of your site based on their browser’s language settings:
RewriteEngine On
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr/index.html [L,R=302]
This example redirects users to French (fr) language preference to the French version of your site.
33. Set Default Charset
You can specify the default character encoding for your website to ensure consistent text rendering across different browsers:
AddDefaultCharset UTF-8
This is particularly useful for websites that handle multiple languages or special characters.
34. Limit Request Methods
You can restrict which HTTP request methods (e.g., GET, POST) are allowed on your website to enhance security.
For instance, you might want to block dangerous methods like TRACE or TRACK:
<LimitExcept GET POST>
Order Deny,Allow
Deny from all
</LimitExcept>
35. Restrict Access During Site Maintenance
If you want to put your site into maintenance mode but allow certain IPs (like your own) to access the site, use this:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123.456.789.000$
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteRule ^(.*)$ /maintenance.html [R=302,L]
Replace 123.456.789.000 with your IP address. Only visitors from that IP will be able to access the site while others will see a maintenance page.
36. Set Cache-Control Headers
Caching helps improve the performance of your site by storing copies of files in users’ browsers. You can set cache control headers to tell browsers how long to cache certain types of files:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
This example sets a longer cache time for images compared to CSS or JavaScript.
Conclusion
These .htaccess tips and tricks can significantly enhance your website’s security, performance, and user experience. Always make a backup of your .htaccess file before making changes and test the configuration to ensure your site behaves as expected.
