Ist es wichtig, in welcher Reihenfolge Regeln in htaccess platziert werden?

9

Ich hoffe, dies ist eine einfache JA- oder NEIN-Antwort (bitte geben Sie an, warum)

Frage 1: Ist es wichtig, in welcher Reihenfolge die Regeln in htaccess gestellt werden? Da es sich um vollständig getrennte Elemente handelt: zum Beispiel

F2: Wenn ja, wende ich die richtige Bestellung an? um den htacces motor zu beschleunigen und ihn nicht mit unnötigen regeln zu überlasten?

F3: Tipps zum Deaktivieren / Hinzufügen sind hier herzlich willkommen +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 /
Sam
quelle

Antworten:

10

Nun, .htaccess-Dateien verwenden dasselbe Format wie die reguläre Apache-Konfigurationsdatei, daher gelten dieselben Regeln.

Die meisten Konfigurationseinstellungen hängen nicht von der Reihenfolge ab, einige jedoch - abhängig von der Einstellung.

RewriteRuleund RewriteCondzB sind sie empfindlich gegenüber Bestellungen, daher lautet die Antwort in diesem Fall JA.

Siehe z

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

für eine Erklärung der Reihenfolge, in der diese ausgewertet werden.

sleske
quelle
4

Es ist wichtig. Zitat aus der Dokumentation zu RewriteRule :

Die Reihenfolge, in der diese Regeln definiert sind, ist wichtig - dies ist die Reihenfolge, in der sie zur Laufzeit angewendet werden.

Flimm
quelle
1
Innerhalb von mod_rewrite ist es wichtig - ja. Das OP adressiert jedoch nicht speziell mod_rewrite und es gibt viele andere Anweisungen von anderen Modulen in der OP- .htaccessDatei. Kurz gesagt, Anweisungen aus verschiedenen Modulen (und in verschiedenen Containern ) werden unabhängig und in einer vordefinierten Reihenfolge ausgeführt, unabhängig von ihrer offensichtlichen Reihenfolge in der Konfigurationsdatei.
MrWhite
1

Ich kann nicht darüber sprechen, wie sich beispielsweise die Reihenfolge von <files>vs <Rewrite>auf die Leistung auswirkt. Ich versuche das selbst herauszufinden. Ich konnte keine Informationen dazu finden, also spielt es möglicherweise keine Rolle?

Ich möchte jedoch darauf hinweisen, dass die Ausführungsreihenfolge zwischen Rewritevs Redirect(und RedirectMatch) möglicherweise nicht in der angegebenen Reihenfolge liegt, obwohl dies häufig erwartet wird.
Insbesondere werden die Module mod_rewriteund und mod_aliasunabhängig voneinander und in verarbeitet diese Reihenfolge.

  1. Alle mod_rewrite-Direktiven ( Rewrite) werden ausgeführt (in der Reihenfolge, in der sie aufgelistet sind).
  2. DANN werden alle mod_alias-Direktiven ( Redirectund RedirectMatch) in der Reihenfolge ausgeführt, in der sie in der Datei aufgeführt sind.

Selbst wenn a Redirectfortfährt Rewrite, wird die Umleitung erst verarbeitet, nachdem alle Umschreibungen verarbeitet wurden.

Eine Möglichkeit, die Datei "lesbar" zu halten, wenn Sie sowohl umleiten als auch neu schreiben, besteht darin, das mod_aliasModul überhaupt nicht zu verwenden . Verwenden Sie stattdessen nur mod_rewrite. Das Umschreiben mit dem [R] -Flag verwandelt es im Wesentlichen in ein Umschreiben.
Die Antwort dieses Webmasters zeigt, wie.

Jetzt werden alle Anweisungen in der Reihenfolge ausgeführt, in der sie in der Datei erscheinen, sodass es keine bösen Überraschungen oder Verwirrung über die Ausführungsreihenfolge gibt. Alternativ Sie können körperlich alle die verlagern Redirectund RedirectMatchRichtlinien zum „Boden“ der Datei, um sich daran zu erinnern , dass sie erst ausgeführt wird , nachdem die Rewriteohnehin s.

Hier sind einige gute StackExchange-Antworten, die bis zu diesem Punkt aufgeklärt wurden:

Im Übrigen konnte ich beispielsweise keine Informationen zur Leistung zwischen Platzierung filesvor oder nach rewrites finden. Der einzige leistungsbasierte Ratschlag, den ich gefunden habe, lautet: Wenn man Zugriff auf Serverkonfigurationsdateien hat, ist es am besten, so viel wie möglich von der .htaccess-Datei in die Konfigurationsdatei zu verschieben und die .htaccess-Dateien insgesamt zu deaktivieren (oder bestimmte Verzeichnisse anzugeben, in denen .htaccess-Dateien sollten gelesen werden).

Die Logik dort ist, dass Regeln, die in der Konfigurationsdatei platziert sind, nur einmal gelesen werden müssen. Wenn die htaccess-Verarbeitung aktiviert ist, muss für jede Anforderung jedes Verzeichnis des Servers (bei oder höher als das angeforderte Verzeichnis) nach möglichen htaccess-Dateien durchsucht werden, unabhängig davon, ob sie vorhanden sind oder nicht. Und wenn doch, muss jeder neu gelesen werden.

  • apache docs erwähnt dies am Ende des Abschnitts ".htaccess-Dateien", erklärt jedoch nicht, warum und Sie müssen sich umsehen, um herauszufinden, wie.
  • http://www.apacheweek.com/features/tips "So beschleunigen Sie den Apache-Abschnitt" zeigt visuell das Warum in schneller Reihenfolge.
  • Apache-Leistung: .htaccess deaktivieren - Springen Sie nach unten, um zuerst den Abschnitt "Deaktivieren von .htaccess und Verwenden von mod_rewrite in der Apache-Konfiguration" zu lesen.
SherylHohman
quelle
-1

Ich habe das gleiche Problem gemeldet, aber dies ist eine Serveradministrator-Site-Perspektive, die es ihnen ermöglicht, Apache nach einer Änderung der Apache-Server-Konfiguration neu zu starten.

Bisher ist die beste Antwort, die ich erhalten habe, zuerst die dateibezogenen Anweisungen aufzulisten.

Dies ist sinnvoll, da Apache Verzeichnisse und htaccess-Anweisungen in jedem Verzeichnis verwalten muss.

Listen Sie also zuerst dateibezogene Anweisungen und dann offensichtliche Blöcke auf, um den Apache-Zugriffsprozess in der Reihenfolge der offensichtlichen zu beenden.

Mögliche Lösung zur Optimierung der Anforderungen: - URL-bezogene Korrekturen anfordern - Verzeichnisbezogene Einschränkungen - Indexbezogene Einschränkungen - Dateibezogene Einschränkungen - Proxy-Einschränkungen <- Alle töten - Leerer Benutzeragent <- Alle töten ... Die Liste macht endlosen Spaß

Mein Anliegen bezog sich auf die Reihenfolge der Richtlinien. Soll ich beispielsweise Index-, Datei- und Header-Anweisungen vor RewriteConds festlegen?

Prüfstand
quelle
Fußnote: RewriteRule-Mustersubstitution [Flags] Beantworten Sie diese offensichtliche Frage zur Anwendungsverarbeitung nicht!
Testbench