I hope this is a simple YES or NO answer (please specify why)
Q1: Does it matter in which order rules are placed in htaccess?
Especially when they are completely separated items.
Q2: If yes, am I applying the right order?
I want to to speed up the htacces engine and not overload it with unneccessary rules.
Q3. Any tips as are welcome about what to remove/add.
Thanks!
# 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
andRewriteCond
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:
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
vsRedirect
(andRedirectMatch
), the order of execution may not be in the order listed, although that's often what people may expect..Specifically, the
mod_rewrite
andmod_alias
modules are processed/executed independantly, and in that order.Rewrite
) are executed (in order they are listed).Redirect
andRedirectMatch
) are executed in the order they are listed in the file.So, even if a
Redirect
proceeds aRewrite
, 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 onlymod_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
andRedirectMatch
directives to the "bottom" of the file, so as to remind yourself that they won't be executed until after theRewrite
s anyway.Here are some good StackExchange answers that enlightened on to this point:
As for the rest, I have not been able to find any info on performance between placing
files
before or afterrewrite
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.
I have the same concern posted but this is a server admin site perspective which allows them to restart apache after an apache server config change.
So far, the best response I've received is to list File related directives first.
This makes sense related to apache's need to manage directories and htaccess instructions in each directory.
So, list file related directives first, then obvious blocks to end the apache htaccess process in order of the obvious.
Possible solution to optimize the requests: - request url related corrections - Directory related restrictions - Index related restrictions - file related restrictions - proxy restrictions <-- kill all - empty user agent <-- kill all ... the list is endless fun
My concern related to sequence of directives. For instance, should I set Index, file, and Header directives before RewriteConds?