Назад | Перейти на главную страницу

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

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

Q1: Имеет ли значение, в каком порядке правила размещаются в 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 /

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

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

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

См. Например

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

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

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

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

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

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

  1. Все директивы mod_rewrite (Rewrite) выполняются (в порядке их перечисления).
  2. ЗАТЕМ все директивы mod_alias (Redirect и RedirectMatch) выполняются в порядке Oни перечислены в файле.

Итак, даже если Redirect продолжает Rewrite, Редирект будет обработан только после все перезаписи обработаны.

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

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

Вот несколько хороших ответов StackExchange по этому поводу:

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

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

  • документы apache упоминает об этом в нижней части раздела ".htaccess files", но не объясняет почему, и вам придется покопаться, чтобы узнать, как.
  • http://www.apacheweek.com/features/tips Раздел «Как ускорить работу Apache» наглядно демонстрирует Зачем в быстром порядке.
  • Производительность Apache: отключить .htaccess - спрыгните вниз, чтобы сначала прочитать раздел «Отключение .htaccess и использование mod_rewrite в конфигурации Apache».

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

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

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

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

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

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