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 /
.htaccess
pliku 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.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
Rewrite
vsRedirect
(aRedirectMatch
) kolejność wykonywania może nie być w kolejności wymienionej na liście, chociaż często tego ludzie mogą się spodziewać. Wszczególności moduły
mod_rewrite
imod_alias
są przetwarzane / wykonywane niezależnie, oraz w to zamówienie.Rewrite
) są wykonywane (w kolejności, w jakiej są wymienione).Redirect
iRedirectMatch
) są wykonywane w kolejności, w jakiej są wymienione w pliku.Tak więc, nawet jeśli
Redirect
przejdzie aRewrite
, 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_alias
modułu. Zamiast tego używaj tylkomod_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
Redirect
iRedirectMatch
dyrektyw w „dół” pliku, aby przypomnieć sobie, że nie będą realizowane dopiero poRewrite
s 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
files
przed lub porewrite
, 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.
źródło
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?
źródło