С параметрами Indexes
и LogLevel rewrite:trace6
я вижу, что мое правило перезаписи применяется ко всем файлам в указанном каталоге. Он даже входит в подкаталоги и ищет index.html
. Это плохо для производительности. Это действительно необходимо? Как это отключить? В реальной конфигурации у меня есть «prg» RewriteMap
, и эта программа получает все перечисленные файлы на свой STDIN.
Проблема воспроизводится при минимальной конфигурации:
Среда:
Конфигурации:
/etc/apache2/conf. d/test.conf
(см. ниже полный httpd.conf)
LoadModule rewrite_module /usr/lib64/apache2/mod_rewrite.so
Перезапись отладки LogLevel: trace6
<Каталог "/srv/www/htdocs/test">
Индексы опционов FollowSymLinks
RewriteEngine включен
Плохое правило RewriteRule никогда не бывает
Каталог>
Команды:
mkdir /srv/www/htdocs/test
touch /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzz{a..z}
systemctl restart apache2
tail -F /var/log/apache2/error_log &
curl -s -o /dev/null http://localhost/test/
Вывод:
[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/ ->
[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri ''
[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/index.html -> index.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'index.html'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/index.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/index.html.var -> index.html.var
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'index.html.var'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/index.html.var
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/HEADER.html -> HEADER.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'HEADER.html'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/HEADER.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzza -> zzzzzzzzzzzzzzzzzzzzza
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'zzzzzzzzzzzzzzzzzzzzza'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzza
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzb -> zzzzzzzzzzzzzzzzzzzzzb
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'zzzzzzzzzzzzzzzzzzzzzb'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzb
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] strip per-dir prefix: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzc -> zzzzzzzzzzzzzzzzzzzzzc
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] applying pattern 'badrule' to uri 'zzzzzzzzzzzzzzzzzzzzzc'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] pass through /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzc
...
Полный httpd.conf
:
# sudo -u nobody /sbin/httpd -d /etc/httpd-test -f /etc/httpd-test/httpd.conf -DFOREGROUND
#
# The following is not needed on SUSE
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# The following is not needed on SUSE
LoadModule unixd_module modules/mod_unixd.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule rewrite_module modules/mod_rewrite.so
ErrorLog "|/bin/cat"
LogLevel debug rewrite:trace6
PidFile /dev/shm/httpd-test.pid
ServerName localhost
Listen 8080
DocumentRoot "/srv/www/htdocs"
<Directory "/srv/www/htdocs/test">
Require all granted
Options Indexes FollowSymLinks
RewriteEngine on
RewriteRule badrule neverhappen
</Directory>
Со списком каталогов, сгенерированным mod_autoindex, запускается внутренний подзапрос для всех перечисленных элементов в каталоге. Это указано в журнале сsubreq
(в отличие отinitial
).
Вы можете предотвратить обработку директивы RewriteRule
для подзапросов, используя флаг NS
(nosubreq
). Например,:
RewriteRule badrule neverhappen [NS]
В качестве альтернативы вы можете переместить директиву RewriteRule
из контейнера <Directory>
и разместить ее непосредственно под директивой <VirtualHost>
. Обратите внимание, что директиву , возможно, необходимо изменить. немного, поскольку теперь он работает в другом контексте(виртуальном хосте , а не в каталоге )и обрабатывается ранее. Это естественным образом предотвращает обработку директивы для каждого элемента в списке каталогов (без включения флага NS
). Однако его все равно можно вызывать для других подзапросов, таких как вызовы файловHeaderName
и ReadmeName
, связанных со списком каталогов (, если эти директивы установлены, независимо от того, существуют файлы или нет), поэтому вы все равно можете включить флаг NS
в эти директивы, если это проблема.
Он даже заходит в под-каталоги и ищет
index.html
Это вызвано модом_dir, тестирующим DirectoryIndex
документы.Если это не требуется, то его можно отключить:
DirectoryIndex disabled
Ссылка: