RewriteRule применяется ко всем файлам во время вывода списка каталогов.

С параметрами Indexesи LogLevel rewrite:trace6я вижу, что мое правило перезаписи применяется ко всем файлам в указанном каталоге. Он даже входит в подкаталоги и ищет index.html. Это плохо для производительности. Это действительно необходимо? Как это отключить? В реальной конфигурации у меня есть «prg» RewriteMap, и эта программа получает все перечисленные файлы на свой STDIN.

Проблема воспроизводится при минимальной конфигурации:

Среда:

  • OpenSUSE Tumbleweed
  • apache2-2.4.51-1.1.x86_64

Конфигурации:

  • /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>
1
задан 14 October 2021 в 09:20
1 ответ

Со списком каталогов, сгенерированным mod_autoindex, запускается внутренний подзапрос для всех перечисленных элементов в каталоге. Это указано в журнале сsubreq(в отличие отinitial).

Вы можете предотвратить обработку директивы RewriteRuleдля подзапросов, используя флаг NS(nosubreq). Например,:

RewriteRule badrule neverhappen [NS]

В качестве альтернативы вы можете переместить директиву RewriteRuleиз контейнера <Directory>и разместить ее непосредственно под директивой <VirtualHost>. Обратите внимание, что директиву , возможно, необходимо изменить. немного, поскольку теперь он работает в другом контексте(виртуальном хосте , а не в каталоге )и обрабатывается ранее. Это естественным образом предотвращает обработку директивы для каждого элемента в списке каталогов (без включения флага NS). Однако его все равно можно вызывать для других подзапросов, таких как вызовы файловHeaderNameи ReadmeName, связанных со списком каталогов (, если эти директивы установлены, независимо от того, существуют файлы или нет), поэтому вы все равно можете включить флаг NSв эти директивы, если это проблема.

Он даже заходит в под-каталоги и ищетindex.html

Это вызвано модом_dir, тестирующим DirectoryIndexдокументы.Если это не требуется, то его можно отключить:

DirectoryIndex disabled

Ссылка:

0
ответ дан 14 October 2021 в 18:10

Теги

Похожие вопросы