Надеюсь, это простой ответ ДА или НЕТ (пожалуйста, укажите, почему)
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
против Redirect
(и RedirectMatch
), порядок исполнения может не в порядке перечисления, хотя часто люди могут ожидать этого ..
В частности, mod_rewrite
и mod_alias
модули обрабатываются / выполняются независимо, а в который порядок.
Rewrite
) выполняются (в порядке их перечисления). Redirect
и RedirectMatch
) выполняются в порядке Oни перечислены в файле. Итак, даже если Redirect
продолжает Rewrite
, Редирект будет обработан только после все перезаписи обработаны.
Один из способов сохранить доступность файла для чтения, если у вас есть и перенаправления, и перезапись, - не использовать mod_alias
модуль вообще. Вместо этого используйте только mod_rewrite
. Перезапись с флагом [R], по сути, превращает его в перезапись.
Ответ этого веб-мастера покажи покажи.
Теперь все директивы будут выполняться в том порядке, в котором они появляются в файле, поэтому нет неприятных сюрпризов или путаницы в порядке выполнения. В качестве альтернативы вы мог физически переместить все Redirect
и RedirectMatch
директивы в «низ» файла, чтобы напомнить себе, что они не будут выполняться до тех пор, пока Rewrite
во всяком случае.
Вот несколько хороших ответов StackExchange по этому поводу:
Что касается остального, я не смог найти никакой информации о производительности между размещением files
до или после rewrite
s, например. Единственный совет, основанный на производительности, который я нашел, заключается в том, что если у кого-то есть доступ к файлам конфигурации сервера, то лучше переместить как можно больше из файл .htaccess к файл конфигурации и полностью отключите файлы .htaccess (или укажите конкретные каталоги, в которых файлы .htaccess должен читать).
Логика заключается в том, что правила, помещенные в файл конфигурации, нужно прочитать только один раз. Если включена обработка htaccess, то для каждый запрос, каждый каталог сервера (в или выше, чем запрошенный каталог) необходимо искать возможные файлы htaccess, независимо от того, существуют они или нет. А если они это сделают, все придется перечитывать заново.
У меня такая же проблема, но это перспектива сайта администратора сервера, которая позволяет им перезапускать apache после изменения конфигурации сервера apache.
Пока что лучший ответ, который я получил, - это сначала перечислить директивы, связанные с файлами.
Это имеет смысл, связанный с необходимостью Apache управлять каталогами и инструкциями htaccess в каждом каталоге.
Итак, сначала перечислите директивы, относящиеся к файлам, а затем очевидные блоки, чтобы завершить процесс apache htaccess в порядке очевидного.
Возможное решение для оптимизации запросов: - исправления, связанные с URL-адресом - ограничения, связанные с каталогом - ограничения, связанные с индексом - ограничения, связанные с файлами - ограничения прокси <- убить все - пустой пользовательский агент <- убить всех ... список бесконечен
Меня беспокоит последовательность директив. Например, следует ли установить директивы Index, file и Header перед RewriteConds?