November 2024
M T W T F S S
 123
45678910
11121314151617
18192021222324
252627282930  

Categories

November 2024
M T W T F S S
 123
45678910
11121314151617
18192021222324
252627282930  

.htaccess or mod_rewrite encyclopedia

.htaccess or mod_rewrite encyclopedia
collected here are a variety of practical .htaccess snippets, you can think of the use of almost all here.

Disclaimer : Although these snippets directly copied to your .htaccess file, the vast majority of cases are easy to use, but there are very few cases where you need to modify some of the job. At your own risk.

IMPORTANT NOTE : Apache 2.4 is not compatible changes, especially in terms of access to configuration control. For more information, please refer to this updated document and article .

Table of Contents

Again and redirection
Forced www
Www mandatory general method
Forced non-www
Forced non-www common method
Forced HTTPS
By forcing HTTPS proxy
Add a slash at the end of compulsory
Remove trailing slashes
Redirect to a page
Directory alias
Script aliases
Redirect the entire site
Clean URL
Security
Deny all access
Deny all access (excluding section)
Shield reptile / malicious access
Hidden files and directories
Protect the backup files and source code files
Ban directory browsing
Prohibit pictures Daolian
Prohibit pictures hotlinking (specify name)
Password Protected Directories
Password-protected files
Visitor Referrer filtered through
Prevent nesting other pages
Performance
Archive
Set an expiration header
Close eTags logo
Other
Setting up a PHP variable
Custom Error Pages
Forced Download
Blocking the download
Run cross-domain font reference
Auto UTF-8 Encode
Switching PHP version
Prohibit IE Compatibility View
Supports WebP image format
Again and redirection

Note: you first need to install and enable server mod_rewrite module.

Forced www

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

Www mandatory general method

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
This method can be used at any site.

Forced non-www

WWW what is good, or non-www good, no conclusion, if you like without the www, you can use the following script:

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

Forced non-www common method

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]

Forced HTTPS

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# Note: It’s also recommended to enable HTTP Strict Transport Security (HSTS)
# on your HTTPS website to help prevent man-in-the-middle attacks.
# See https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
<IfModule mod_headers.c>
Header always set Strict-Transport-Security “max-age=31536000; includeSubDomains”
</IfModule>
By forcing HTTPS proxy

If you use a proxy, this method is useful for you.

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Add a slash at the end of compulsory

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

Remove trailing slashes

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

Redirect to a page

Redirect 301 /oldpage.html http://www.example.com/newpage.html
Redirect 301 /oldpage2.html http://www.example.com/folder/
Source

Directory alias

RewriteEngine On
RewriteRule ^source-directory/(.*) target-directory/$1
Script aliases

FallbackResource /index.fcgi
This example has an index.fcgi file in some directory, and any requests within that directory that fail to
resolve a filename/directory will be sent to the index.fcgi script.
It’s good if you want baz.foo/some/cool/path to be handled by baz.foo/index.fcgi (which also supports requests to baz.foo)
while maintaining baz.foo/css/style.css and the like. Get access to the original path from the PATH_INFO environment variable,
as exposed to your scripting environment.

RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
This is a less efficient version of the FallbackResource directive (because using mod_rewrite is more complex than just handling the FallbackResource directive), but it’s also more flexible.

Redirect the entire site

Redirect 301 / http://newsite.com/
This way does it with links intact. That is www.oldsite.com/some/crazy/link.html will become
www.newsite.com/some/crazy/link.html. This is extremely helpful when you are just “moving” a site to a new domain. Source

Clean URL

This snippet lets you use “clean” URLs — those without a PHP extension, e.g.
example.com/users instead of example.com/users.php.
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
Source

Security

Deny all access

## Apache 2.2
Deny from all

## Apache 2.4
# Require all denied

But wait, this will lock you out from your content as well! Thus introducing…
Deny all access (excluding section)

## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx is your IP. If you replace the last three digits with 0/12 for example, this will specify a range of IPs within the same network, thus saving you the trouble to list all allowed IPs separately.

Source

Now of course there’s a reversed version:

Shield reptile / malicious access
## Apache 2.2
Order deny,allow
Allow from all
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy

## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy

Hidden files and directories

Hidden files and directories (those whose names start with a dot .) should most, if not all, of the time be secured. For example: .htaccess, .htpasswd, .git, .hg…

RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule “(^|/)\.” – [F]
Alternatively, you can just raise a Not Found error, giving the attacker dude no clue:

RedirectMatch 404 /\..*$
Protect the backup files and source code files

These files may be left by some text/html editors (like Vi/Vim) and pose a great security danger if exposed to public.

<FilesMatch “(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$”>
## Apache 2.2
Order allow,deny
Deny from all
Satisfy All

## Apache 2.4
# Require all denied
</FilesMatch>
Source

Ban directory browsing
Options All -Indexes
Prohibit pictures Daolian

RewriteEngine on
# Remove the following line if you want to block blank referrer too
RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ – [NC,F,L]

# If you want to display a “blocked” banner in place of the hotlinked image,
# replace the above rule with:
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]
Prohibit pictures hotlinking (specify name)

Sometimes you want to from some bad guys only.

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite2\.com [NC,OR]
RewriteRule \.(jpg|jpeg|png|gif)$ – [NC,F,L]

# If you want to display a “blocked” banner in place of the hotlinked image,
# replace the above rule with:
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]

Password Protected Directories

First you need to create a .htpasswd file somewhere in the system:

htpasswd -c /home/fellowship/.htpasswd boromir
Then you can use it for authentication:

AuthType Basic
AuthName “One does not simply”
AuthUserFile /home/fellowship/.htpasswd
Require valid-user
AuthName “One still does not simply”
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd

<Files “one-ring.o”>
Require valid-user
</Files>

<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>

Visitor Referrer filtered through
This denies access for all users who are coming from (referred by) a specific domain.
Source
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} somedomain\.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain\.com
RewriteRule .* – [F]

Prevent nesting other pages

This prevents the website to be framed (i.e. put into an iframe tag), when still allows framing for a specific URI.

SetEnvIf Request_URI “/starry-night” allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing
Performance

Archive

<IfModule mod_deflate.c>

# ?? compression for mangled headers.
# http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding “gzip,deflate” env=HAVE_Accept-Encoding
</IfModule>
</IfModule>

# Compress all output labeled with one of the following MIME-types
# (for Apache versions below 2.3.7, you don’t need to enable `mod_filter`
# and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
# as `AddOutputFilterByType` is still in the core directives).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
</IfModule>

</IfModule>

Source

Set an expiration header

xpires headers tell the browser whether they should request a specific file from the server or just grab it from the cache. It is advisable to set static content’s expires headers to something far in the future.
If you don’t control versioning with filename-based cache busting, consider lowering the cache time for resources like CSS and JS to something like 1 week. Source

<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault “access plus 1 month”

# CSS
ExpiresByType text/css “access plus 1 year”

# Data interchange
ExpiresByType application/json “access plus 0 seconds”
ExpiresByType application/xml “access plus 0 seconds”
ExpiresByType text/xml “access plus 0 seconds”

# Favicon (cannot be renamed!)
ExpiresByType image/x-icon “access plus 1 week”

# HTML components (HTCs)
ExpiresByType text/x-component “access plus 1 month”

# HTML
ExpiresByType text/html “access plus 0 seconds”

# JavaScript
ExpiresByType application/javascript “access plus 1 year”

# Manifest files
ExpiresByType application/x-web-app-manifest+json “access plus 0 seconds”
ExpiresByType text/cache-manifest “access plus 0 seconds”

# Media
ExpiresByType audio/ogg “access plus 1 month”
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/jpeg “access plus 1 month”
ExpiresByType image/png “access plus 1 month”
ExpiresByType video/mp4 “access plus 1 month”
ExpiresByType video/ogg “access plus 1 month”
ExpiresByType video/webm “access plus 1 month”

# Web feeds
ExpiresByType application/atom+xml “access plus 1 hour”
ExpiresByType application/rss+xml “access plus 1 hour”

# Web fonts
ExpiresByType application/font-woff2 “access plus 1 month”
ExpiresByType application/font-woff “access plus 1 month”
ExpiresByType application/vnd.ms-fontobject “access plus 1 month”
ExpiresByType application/x-font-ttf “access plus 1 month”
ExpiresByType font/opentype “access plus 1 month”
ExpiresByType image/svg+xml “access plus 1 month”
</IfModule>
Close eTags logo

By removing the ETag header, you disable caches and browsers from being able to validate files, so they are forced to rely on your Cache-Control and Expires header. Source

<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
Miscellaneous

Setting up a PHP variable

php_value <key> <val>

# For example:
php_value upload_max_filesize 50M
php_value max_execution_time 240
Custom Error Pages

ErrorDocument 500 “Houston, we have a problem.”
ErrorDocument 401 http://error.example.com/mordor.html
ErrorDocument 404 /errors/halflife3.html
Forced Download

Sometimes you want to the browser to download some content instead of displaying it.
<Files *.md>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>

Blocking the download

Sometimes you want to ?? the browser to display some content instead of downloading it.

<FilesMatch “\.(tex|log|aux)$”>
Header set Content-Type text/plain
</FilesMatch>
Run cross-domain font reference

CDN-served webfonts might not work in Firefox or IE due to CORS. This snippet solves the problem.

<IfModule mod_headers.c>
<FilesMatch “\.(eot|otf|ttc|ttf|woff|woff2)$”>
Header set Access-Control-Allow-Origin “*”
</FilesMatch>
</IfModule>
Source

Auto UTF-8 Encode

Your text content should always be UTF-8 encoded, no?

# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset utf-8

# UTF-8 for a number of file formats
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Source

Switching PHP version

If you’re on a shared host, chances are there are more than one version of PHP installed, and sometimes you want a specific version for your website. For example, Laravel requires PHP >= 5.4. The following snippet should switch the PHP version for you.

AddHandler application/x-httpd-php55 .php

# Alternatively, you can use AddType
AddType application/x-httpd-php55 .php

Compatibility View in IE may affect how some websites are displayed. The following snippet should
IE to use the Edge Rendering Engine and disable the Compatibility View.

<IfModule mod_headers.c>
BrowserMatch MSIE is-msie
Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
Supports WebP image format

If WebP images are supported and an image with a .webp extension and the same name is found at the same place as the jpg/png image that is going to be served, then the WebP image is served instead.

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>