Czy ma znaczenie kolejność reguł w htaccess?

9

Mam nadzieję, że jest to prosta odpowiedź TAK lub NIE (proszę podać dlaczego)

P1: Czy ma znaczenie, w jakiej kolejności reguły są umieszczone w htaccess? Ponieważ są to całkowicie oddzielne elementy: na przykład

P2: Jeśli tak, czy stosuję właściwą kolejność? aby przyspieszyć silnik htacces i nie przeciążać go niepotrzebnymi regułami?

P3: wszelkie wskazówki, co tu wyłączyć / dodać, są mile widziane +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
źródło

Odpowiedzi:

10

Pliki .htaccess używają tego samego formatu, co zwykły plik konfiguracyjny Apache, więc obowiązują te same reguły.

Większość ustawień konfiguracji nie zależy od kolejności, ale niektóre - zależą od ustawienia.

RewriteRulei RewriteCondnp. są wrażliwi na porządek, więc w takim przypadku odpowiedź brzmi TAK.

Zobacz np

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

w celu wyjaśnienia kolejności ich oceny.

Śleske
źródło
4

To ma znaczenie. Cytując z dokumentacji RewriteRule :

Kolejność definiowania tych reguł jest ważna - jest to kolejność, w jakiej będą one stosowane w czasie wykonywania.

Flimm
źródło
1
W mod_rewrite ma to znaczenie - tak. Jednak OP nie odnosi się konkretnie do mod_rewrite i w .htaccesspliku OP znajduje się wiele innych dyrektyw z innych modułów . Krótko mówiąc, dyrektywy z różnych modułów (i różnych kontenerów ) wykonują się niezależnie i we wstępnie określonej kolejności, niezależnie od ich pozornej kolejności w pliku konfiguracyjnym.
MrWhite
1

Nie mogę mówić o tym, jak na przykład kolejność <files>vs <Rewrite>wpływa na wydajność. Próbuję to odkryć sam. Nie udało mi się znaleźć żadnych informacji na ten temat, więc może to nie ma znaczenia?

Chciałbym jednak zauważyć , że pomiędzy Rewritevs Redirect(a RedirectMatch) kolejność wykonywania może nie być w kolejności wymienionej na liście, chociaż często tego ludzie mogą się spodziewać. W
szczególności moduły mod_rewritei mod_aliassą przetwarzane / wykonywane niezależnie, oraz w to zamówienie.

  1. Wszystkie dyrektywy mod_rewrite ( Rewrite) są wykonywane (w kolejności, w jakiej są wymienione).
  2. NASTĘPNIE wszystkie dyrektywy mod_alias ( Redirecti RedirectMatch) są wykonywane w kolejności, w jakiej są wymienione w pliku.

Tak więc, nawet jeśli Redirectprzejdzie a Rewrite, przekierowanie zostanie przetworzone dopiero po przetworzeniu wszystkich Przepisanych treści.

Jednym ze sposobów, aby plik był „czytelny”, jeśli masz zarówno przekierowania, jak i przepisywanie, to w ogóle nie używać mod_aliasmodułu. Zamiast tego używaj tylko mod_rewrite. Przepisanie z flagą [R] zasadniczo zmienia to w przepisywanie.
Odpowiedź tego webmastera pokazuje, jak to zrobić .

Teraz wszystkie dyrektywy zostaną wykonane w kolejności, w jakiej pojawiają się w pliku, więc nie ma nieprzyjemnych niespodzianek ani zamieszania co do kolejności wykonywania. Alternatywnie, ty mógł fizycznie przenieść cały Redirecti RedirectMatchdyrektyw w „dół” pliku, aby przypomnieć sobie, że nie będą realizowane dopiero po Rewrites tak.

Oto kilka dobrych odpowiedzi StackExchange, które oświeciły do ​​tego momentu:

Co do reszty, nie byłem w stanie znaleźć żadnych informacji na temat wydajności między umieszczeniem filesprzed lub po rewrite, na przykład. Jedyną poradą, którą znalazłem, jest to, że jeśli ktoś ma dostęp do plików konfiguracyjnych serwera, najlepiej przenieść jak najwięcej z pliku .htaccess do pliku konfiguracyjnego i całkowicie wyłączyć pliki .htaccess (lub określić konkretne katalogi, w których Pliki .htaccess powinny zostać odczytane).

Logika polega na tym, że reguły umieszczone w pliku konfiguracyjnym należy odczytać tylko raz. Jeśli przetwarzanie htaccess jest włączone, to dla każdego żądania należy przeszukać każdy katalog serwera (w żądanym katalogu lub wyżej) pod kątem możliwych plików htaccess, niezależnie od tego, czy istnieją. A jeśli tak, każdy musi zostać przeczytany od nowa.

  • Apache docs wspomina o tym na dole sekcji „Pliki .htaccess”, ale nie wyjaśnia, dlaczego, i musisz się rozejrzeć, aby dowiedzieć się, jak to zrobić.
  • http://www.apacheweek.com/features/tips „Sekcja Jak przyspieszyć Apache” wizualnie pokazuje, dlaczego w szybkiej kolejności.
  • Wydajność Apache: Wyłącz .htaccess - najpierw przeskocz w dół, aby przeczytać sekcję „Wyłączanie .htaccess i używanie mod_rewrite w konfiguracji Apache”.
SherylHohman
źródło
-1

Mam takie same obawy, ale jest to perspektywa strony administratora serwera, która pozwala im zrestartować apache po zmianie konfiguracji serwera apache.

Jak dotąd najlepszą odpowiedzią, jaką otrzymałem, jest wyszczególnienie najpierw dyrektyw związanych z plikami.

Ma to sens związany z potrzebą apache do zarządzania katalogami i instrukcjami htaccess w każdym katalogu.

Tak więc najpierw wypisz listę dyrektyw związanych z plikami, a następnie oczywiste bloki, aby zakończyć proces apache htaccess w kolejności oczywistych.

Możliwe rozwiązanie w celu optymalizacji żądań: - korekty związane z adresem URL żądania - ograniczenia związane z katalogiem - ograniczenia związane z indeksem - ograniczenia związane z plikami - ograniczenia proxy <- zabij wszystko - pusty agent użytkownika <- zabij wszystko ... lista jest niekończącą się zabawą

Moje obawy dotyczyły sekwencji dyrektyw. Na przykład, czy powinienem ustawić dyrektywy Indeks, Plik i Nagłówek przed RewriteConds?

Testbench
źródło
przypis: Zastępowanie wzorca RewriteRule [flagi] nie odpowiada na to oczywiste pytanie dotyczące przetwarzania aplikacji!
Testbench