Имеет ли значение, в каком порядке правила размещены в htaccess?

9

Я надеюсь, что это простой ответ ДА ​​или НЕТ (пожалуйста, укажите почему)

В1: Имеет ли значение, в каком порядке правила размещены в htaccess? Так как они полностью разделены предметами: например

Q2: Если да, я применяю правильный заказ? чтобы ускорить двигатель htacces и не перегружать его ненужными правилами?

Q3: любые советы относительно того, что отключить / добавить здесь, с радостью приветствуем +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

Ну, файлы .htaccess используют тот же формат, что и обычный файл конфигурации Apache, поэтому применяются те же правила.

Большинство настроек конфигурации не зависят от порядка, но некоторые делают - зависит от настроек.

RewriteRuleи, RewriteCondнапример, чувствительны к порядку, поэтому в этом случае ответ ДА.

См. Например

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

для объяснения порядка их оценки.

sleske
источник
4

Это имеет значение. Цитирование из документации для RewriteRule :

Порядок, в котором определяются эти правила, важен - это порядок, в котором они будут применяться во время выполнения.

Флимм
источник
1
В mod_rewrite это важно - да. Тем не менее, OP не обращается конкретно к mod_rewrite, и в .htaccessфайле OP есть много других директив из других модулей . Короче говоря, директивы из разных модулей (и в разных контейнерах ) выполняются независимо и в предопределенном порядке, независимо от их очевидного порядка в файле конфигурации.
MrWhite
1

Я не могу говорить о том, как порядок <files>против <Rewrite>, например, влияет на производительность. Я пытаюсь выяснить это сам. Я не смог найти никакой информации об этом, так что, возможно, это не имеет значения ??

Тем не менее, я хотел бы отметить, что между Rewriteпротив RedirectRedirectMatch), порядок выполнения может не быть в указанном порядке, хотя это часто то , что люди могут ожидать .. В
частности, mod_rewriteи mod_aliasмодули обрабатываются / выполняются independantly, и в этот порядок.

  1. Все директивы mod_rewrite ( Rewrite) выполняются (в порядке их перечисления).
  2. ТОГДА все директивы mod_alias ( Redirectа RedirectMatch) выполняются в том порядке , они перечислены в файле.

Таким образом, даже если a Redirectпереходит a Rewrite, перенаправление будет обработано только после того, как все перезаписи были обработаны.

Один из способов сохранить файл «читабельным», если у вас есть и перенаправление, и перезапись, - вообще не использовать mod_aliasмодуль. Вместо этого используйте только mod_rewrite. Перезапись с флагом [R] по сути превращает его в перезапись.
Ответ этого веб-мастера показывает, как.

Теперь все директивы будут выполняться в порядке их появления в файле, поэтому никаких неприятных сюрпризов или путаницы в порядке выполнения не будет. Кроме того , вы могли физически передислоцировать все Redirectи RedirectMatchдирективы «снизу» файла, с тем, чтобы напомнить себе , что они никогда не будут выполняться до тех пор , после того , как RewriteS так или иначе.

Вот несколько хороших ответов StackExchange, которые пролили свет на этот момент:

Что касается остального, я не смог найти никакой информации о производительности между размещением filesдо или после rewrites, например. Единственное выступление на основе совет , который я нашел, что если один имеет доступ к файлам конфигурации сервера, то лучше двигаться как можно больше из файла .htaccess в конфигурационном файле, и отключить файлы .htaccess в целом (или указать конкретные каталоги , в которых Файлы .htaccess должны быть прочитаны).

Логика заключается в том, что правила, помещенные в файл конфигурации, должны быть прочитаны только один раз. Если обработка htaccess включена, то для каждого запроса в каждом каталоге сервера (на уровне или выше запрашиваемого каталога) необходимо искать возможные файлы htaccess, независимо от того, существуют они или нет. И если они делают, каждый должен быть прочитан заново.

SherylHohman
источник
-1

У меня есть такая же проблема, но это перспектива сайта администратора сервера, которая позволяет им перезапустить apache после изменения конфигурации сервера apache.

Пока что лучший ответ, который я получил, - сначала перечислить директивы, связанные с файлами.

Это имеет смысл, связанный с необходимостью apache управлять каталогами и инструкциями htaccess в каждом каталоге.

Итак, сначала перечислите директивы, связанные с файлами, а затем очевидные блоки, чтобы завершить процесс apache htaccess в порядке очевидных.

Возможное решение для оптимизации запросов: - запросить исправления, связанные с URL - ограничения, связанные с каталогом - ограничения, связанные с индексом - ограничения, связанные с файлами - ограничения прокси-сервера <- kill all - пустой пользовательский агент <- kill all ... список бесконечен

Мое беспокойство связано с последовательностью директив. Например, я должен установить директивы Index, file и Header перед RewriteConds?

Испытательный стенд
источник
сноска: замена шаблона RewriteRule [флаги] не отвечает на этот очевидный вопрос обработки приложения!
Testbench