Рейтинг:1

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

флаг vn

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

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

Среда:

  • OpenSUSE Перекати-поле
  • апач2-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/тест
коснитесь /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzz{a..z}
systemctl перезапустить apache2
хвост -F /var/log/apache2/error_log &
curl -s -o /dev/null http://localhost/test/

Вывод:

[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/ ->
[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri ''
[rid#556dab9a2060/initial] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/index.html -> index.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri 'index.html'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/index.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/index.html.var -> index.html.var
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri 'index.html.var'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/index.html.var
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/HEADER.html -> HEADER.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri 'HEADER.html'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/HEADER.html
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс каждого каталога: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzza -> zzzzzzzzzzzzzzzzzzzzza
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона «badrule» к uri «zzzzzzzzzzzzzzzzzzzzza»
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzza
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzb -> zzzzzzzzzzzzzzzzzzzzzzb
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri 'zzzzzzzzzzzzzzzzzzzzzzb'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzzb
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] удалить префикс для каждого каталога: /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzc -> zzzzzzzzzzzzzzzzzzzzzzc
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] применение шаблона 'badrule' к uri 'zzzzzzzzzzzzzzzzzzzzzzc'
[rid#556dab9a8090/subreq] [perdir /srv/www/htdocs/test/] пройти через /srv/www/htdocs/test/zzzzzzzzzzzzzzzzzzzzzc
...

Полный httpd.conf:

# sudo -u никто /sbin/httpd -d /etc/httpd-test -f /etc/httpd-test/httpd.conf -DFOREGROUND
#
# Следующее не требуется в 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

# Следующее не требуется в SUSE
Модули LoadModule unixd_module/mod_unixd.so

Модули загрузки authz_core_module/mod_authz_core.so
LoadModule autoindex_module modules/mod_autoindex.so
Модули LoadModule rewrite_module/mod_rewrite.so

Журнал ошибок "|/bin/cat"
Перезапись отладки LogLevel: trace6
Pid-файл /dev/shm/httpd-test.pid

имя_сервера

Слушай 8080

DocumentRoot "/srv/www/htdocs"

<Каталог "/srv/www/htdocs/test">
    Требовать все предоставленные
    Индексы опционов FollowSymLinks
    RewriteEngine включен
    Плохое правило RewriteRule никогда не бывает
</Каталог>
Рейтинг:0
флаг kz

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

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

Плохое правило RewriteRule никогда не бывает [NS]

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

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

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

DirectoryIndex отключен

Справка:

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.