9

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 /
10

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.

4

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.

  • 1
    Within mod_rewrite, it matters - yes. However, the OP isn't specifically addressing mod_rewrite and there are many other directives from other modules in the OP's .htaccess file. In short, directives from different modules (and in different containers) execute independently and in a predefined order, regardless of their apparent order in the config file. – MrWhite Sep 9 '17 at 15:01
0

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.

  1. All mod_rewrite directives (Rewrite) are executed (in order they are listed).
  2. THEN all mod_alias directives (Redirect and RedirectMatch) 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 Rewrites 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 after rewrites, 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.

-1

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?

  • footnote: RewriteRule pattern substitution [flags] do Not answer this obvious application processing question! – Testbench Feb 18 '15 at 22:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.