Est-ce important dans quel ordre les règles sont placées dans htaccess?


9

J'espère que c'est une simple réponse OUI ou NON (veuillez préciser pourquoi)

Q1: Est-ce important dans quel ordre les règles sont placées dans htaccess? Comme ce sont des éléments complètement séparés: par exemple

Q2: Si oui, est-ce que j'applique la bonne commande? afin d'accélérer le moteur htacces et de ne pas le surcharger avec des règles inutiles?

Q3: tous les conseils sur ce qu'il faut désactiver / ajouter ici sont les bienvenus +1 +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 /

Réponses:


10

Eh bien, les fichiers .htaccess utilisent le même format que le fichier de configuration Apache normal, donc les mêmes règles s'appliquent.

La plupart des paramètres de configuration ne dépendent pas de l'ordre, mais certains le font - dépend du paramètre.

RewriteRuleet RewriteCondpar exemple sont sensibles à l'ordre, donc dans ce cas, la réponse est OUI.

Voir par exemple

http://wiki.apache.org/httpd/RewriteRule

pour une explication de l'ordre dans lequel ceux-ci sont évalués.


4

C'est important. Citant de la documentation de RewriteRule :

L'ordre dans lequel ces règles sont définies est important - c'est l'ordre dans lequel elles seront appliquées au moment de l'exécution.


1
Dans mod_rewrite, c'est important - oui. Cependant, l'OP ne traite pas spécifiquement de mod_rewrite et il existe de nombreuses autres directives provenant d'autres modules dans le .htaccessfichier de l'OP . En bref, les directives de différents modules (et dans différents conteneurs ) s'exécutent indépendamment et dans un ordre prédéfini, quel que soit leur ordre apparent dans le fichier de configuration.
MrWhite

1

Je ne peux pas parler de la façon dont l'ordre des <files>vs <Rewrite>, par exemple, affecte les performances. J'essaie de le découvrir moi-même. Je n'ai pas pu trouver d'informations à ce sujet, donc cela n'a peut-être pas d'importance ??

Cependant, je voudrais souligner qu'entre Rewritevs Redirect(et RedirectMatch), l'ordre d'exécution peut ne pas être dans l'ordre indiqué, bien que ce soit souvent ce à quoi les gens peuvent s'attendre.
Plus précisément, les modules mod_rewriteet mod_aliassont traités / exécutés indépendamment, et dans cet ordre.

  1. Toutes les directives mod_rewrite ( Rewrite) sont exécutées (dans l'ordre où elles sont répertoriées).
  2. ALORS toutes les directives mod_alias ( Redirectet RedirectMatch) sont exécutées dans l'ordre dans lequel elles sont répertoriées dans le fichier.

Ainsi, même si a Redirectprocède à a Rewrite, la redirection ne sera traitée qu'après le traitement de toutes les réécritures.

Une façon de garder le fichier «lisible» si vous avez à la fois des redirections et des réécritures, est de ne pas utiliser du mod_aliastout le module. Au lieu de cela, utilisez uniquement mod_rewrite. Réécrire avec le drapeau [R] le transforme essentiellement en réécriture.
La réponse de ce webmaster montre comment.

Maintenant, toutes les directives seront exécutées dans l'ordre dans lequel elles apparaissent dans le fichier, donc il n'y a pas de mauvaises surprises, ni de confusion sur l'ordre d'exécution. Alternativement, vous pouvez déplacer physiquement toutes les directives Redirectet RedirectMatchau "bas" du fichier, afin de vous rappeler qu'elles ne seront exécutées qu'après le Rewrites de toute façon.

Voici quelques bonnes réponses StackExchange qui se sont éclairées sur ce point:

Pour le reste, je n'ai pas pu trouver d'informations sur les performances entre le placement filesavant ou après rewrites, par exemple. Le seul conseil basé sur les performances que j'ai trouvé, c'est que si l'on a accès aux fichiers de configuration du serveur, il est préférable de déplacer autant que possible du fichier .htaccess vers le fichier de configuration et de désactiver complètement les fichiers .htaccess (ou spécifier des répertoires spécifiques où les fichiers .htaccess doivent être lus).

La logique est que les règles placées dans le fichier de configuration n'ont besoin d'être lues qu'une seule fois. Si le traitement htaccess est activé, pour chaque demande, chaque répertoire du serveur (au niveau ou supérieur au répertoire demandé) doit être recherché pour les fichiers htaccess possibles, qu'ils existent ou non. Et s'ils le font, chacun doit être relu.


-1

J'ai la même préoccupation affichée, mais c'est une perspective de site d'administration du serveur qui leur permet de redémarrer apache après un changement de configuration du serveur apache.

Jusqu'à présent, la meilleure réponse que j'ai reçue est de lister d'abord les directives liées aux fichiers.

Cela a un sens lié au besoin d'Apache de gérer les répertoires et les instructions htaccess dans chaque répertoire.

Donc, listez d'abord les directives liées aux fichiers, puis les blocs évidents pour terminer le processus apache htaccess dans l'ordre de l'évidence.

Solution possible pour optimiser les requêtes: - corrections liées à l'url de la requête - restrictions liées à l'annuaire - restrictions liées à l'index - restrictions liées aux fichiers - restrictions proxy <- tuer tout - agent utilisateur vide <- tuer tout ... la liste est un plaisir sans fin

Ma préoccupation concernait la séquence des directives. Par exemple, dois-je définir les directives Index, File et Header avant RewriteConds?


note de bas de page: la substitution de modèle RewriteRule [drapeaux] ne répond pas à cette question évidente de traitement des demandes!
Testbench
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.