Does is matter in what order rules are placed in htaccess?
I hope this is a simple YES or NO answer (please specify why)
Q1: Does is matter in what order the rules are placed in htaccess? Since they are completely separated items: for example
Q2: If yes, am I applying the right order? in order to speed up the htacces engine and not overload it with unneccessary rules?
Q3: any tips as to what to disable/add here are jucily welcome +1!
# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /
#####################################################
<IfModule mod_headers.c>
ExpiresActive On
ExpiresDefault M172800
Header unset ETag
FileETag None
Header unset Pragma
##### STATIC FILES
<FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
ExpiresDefault M1209600
Header set Cache-Control "public, max-age=1209600"
</FilesMatch>
##### DYNAMIC PAGES
<FilesMatch "\\.(php)$">
ExpiresDefault M604800
Header set Cache-Control "public, max-age=604800"
</FilesMatch>
</IfModule>
#####################################################
# /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$ /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
####################################################
# NO WWW http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz
##############################################################
ErrorDocument 500 /
ErrorDocument 404 /
Well, .htaccess files use the same format as the regular Apache configuration file, so the same rules apply.
Most config settings do not depend on order, but some do - depends on the setting.
RewriteRule
and RewriteCond
e.g. are sensitive to order, so in that case the answer is YES.
See e.g.
http://wiki.apache.org/httpd/RewriteRule
for an explanation of the order that these are evaluated.
It does matter. Quoting from the documentation for RewriteRule:
The order in which these rules are defined is important - this is the order in which they will be applied at run-time.
I cannot speak on how the order of <files>
vs <Rewrite>
, for example, affects performance. I am trying to find that out myself. I've been unable to find any info about this, so possibly it does not matter??
However, I'd like to point out that between Rewrite
vs Redirect
(and RedirectMatch
), the order of execution may not be in the order listed, although that's often what people may expect..
Specifically, the mod_rewrite
and mod_alias
modules are processed/executed independantly, and in that order.
- All mod_rewrite directives (
Rewrite
) are executed (in order they are listed). -
THEN all mod_alias directives (
Redirect
andRedirectMatch
) are executed in the order they are listed in the file.
So, even if a Redirect
proceeds a Rewrite
, the Redirect will be processed only after all the Rewrites have been processed.
One way to keep the file "readable" if you have both redirects and rewrites, is to not use the mod_alias
module at all. Instead, use only mod_rewrite
. Rewrite with the [R] flag essentially turns it into a rewrite.
This webmaster's Answer shows how.
Now, all the directives will be executed in the order they appear in the file, so there are no nasty surprises, or confusion about the order of execution. Alternatively, you could physically relocate all the Redirect
and RedirectMatch
directives to the "bottom" of the file, so as to remind yourself that they won't be executed until after the Rewrite
s anyway.
Here are some good StackExchange answers that enlightened on to this point:
- The footnote to this answer
- MrWhite's comment to this Answer
As for the rest, I have not been able to find any info on performance between placing files
before or after rewrite
s, for example. The only performance based advice I found, is that if one has access to server configuration files, then it's best to move as much as possible from the .htaccess file to the config file, and disable .htaccess files altogether (or specify specific directories where .htaccess files should be read).
The logic there is that rules placed in the config file need only be read once. If htaccess processing is turned on, then for every request, every directory of the server (at or higher than the requested directory) must be searched for possible htaccess files, whether they exist or not. And if they do, every one must be read anew.
- apache docs mentions this at the bottom of the ".htaccess files" section, but does not explain why, and you have to dig around to find out how.
- http://www.apacheweek.com/features/tips "How to Speed up Apache section" visually demonstrates the why in quick order.
- Apache Performance: Disable .htaccess - jump down to read the "Disabling .htaccess and using mod_rewrite within Apache config" section first.