Apache: Индекс каталога запрещен директивой Options - PullRequest
6 голосов
/ 16 августа 2011

Мы работаем с 4 сетевыми установками Wordpress на Windows Server 2008 R2 VPS с Apache 2.2.17 и PHP 5.3.10, и по некоторым причинам мы регулярно получаем эту (примерную) ошибку:

Журнал ошибок

[Thu Feb 16 15:01:59 2012] [error] [client x.x.x.x] Directory index forbidden by Options directive: C:/_webserver/_www/wp/www/

Журнал доступа

host x.x.x.x - - [17/Feb/2012:12:59:23 +0200] "GET / HTTP/1.1" 403 306 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; GTB7.2; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; MATM)"

Ошибка «Индекс каталога запрещен» обычно означает, что к каталогу пытаются получить доступ, но нет файла (в соответствии с директивой опций) для отображения и список каталогов запрещен. Это однако не тот случай здесь. Ошибка относится к папке C:/_webserver/_www/wp/www/, которая является webroot для проекта, и всегда имела index.php. Кроме того, httpd.conf устанавливается с: DirectoryIndex index.html index.php

Видя, как происходит ошибка в Apache, я думаю, что маловероятно, что это может быть вызвано PHP или Wordpress.

Сложность в том, что мы не знаем, как воспроизвести ошибку, поэтому нам сложно это проверить.

Что мы можем сделать, чтобы выяснить, в чем проблема? Может ли это иметь какое-либо отношение к настройке Apache (кажется излишним вопросом). Может ли это иметь какое-либо отношение к файлу, который уже читает Apache? Есть ли какой-нибудь способ получить больше информации об этой проблеме?

Буду рад любой помощи, которая поможет мне решить этот неприятный случай.

UPDATE

Это модули, которые я сейчас использую

LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
LoadModule cache_module modules/mod_cache.so

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule alias_module modules/mod_alias.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule dir_module modules/mod_dir.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule php5_module "c:/_webserver/_server/php-5.3.10-Win32-VC9-x86/php5apache2_2.dll"

Опции директив:

<Directory />
    Options FollowSymLinks ExecCGI
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>

<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

httpd-vhosts.conf выглядит так:

NameVirtualHost *:80

<VirtualHost *:80>

  <Directory "C:/_webserver/_www/sites/www">

      Options FollowSymLinks
      AllowOverride All
      Order allow,deny
      Allow from all

  </Directory>
  Include "C:/_webserver/_www/sites/htaccess.conf"

  DocumentRoot "C:/_webserver/_www/sites/www"
  ServerName xxx
  ServerAlias xxx
  CustomLog logs/sites.access.log mycombined
  ErrorLog logs/sites.error.log 

</VirtualHost>

У меня настроено 5 виртуальных хостов, каждый со своей ошибкой и журналом доступа. Проекты не используют .htaccess, но это статически настраивается через conf для производительности.

Сервер работает на Windows, поэтому настройка MPM немного ограничена

# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum  number of requests a server process serves
<IfModule mpm_winnt_module>
    ThreadsPerChild       1750
    MaxRequestsPerChild    0
</IfModule>

Окончательное обновление

Ну, я решил полностью отключить кеширование Apache, и с тех пор больше не было ошибок. К сожалению, на этой неделе у меня не было слишком много времени, чтобы провести надлежащее тестирование, но, по крайней мере, я знаю, в чем проблема. А с не очень загруженным сервером пока нет кеширования. Я мог бы вернуться через некоторое время: -)

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

Это, безусловно, что-то сложное для отладки, случайные ошибки - самые худшие: -)

Моими первыми мыслями были проблемы, связанные с "внутренними фиктивными соединениями", но это не показывало бы вашу подпись IE8-бетаaccess.log.

Итак, я нашел три ссылки, которые вы можете исследовать:

Исходя из этого, я думаю, что эта проблема немного похожа на взаимодействие с наркотиками.Итак, первое, что нужно сделать:

  1. Проверьте модули, загруженные в вашу конфигурацию apache, и удалите (прокомментируйте строку загрузки) те, которые вам не нужны вообще (и у вас будет более быстрый Apache, если выникогда раньше этого не делал!).
  2. Создайте тестовую среду для модулей, которые вы все еще используете в работе (где ее удаление приведет к сбою приложения).Вам нужно будет иметь возможность воспроизвести ошибку с помощью wget или ab или любого другого массивного инструмента HTTP-запросов.
  3. пытайтесь отключать модули один за другим, пока проблема не исчезнет.

Модули, которые обычно ведут себя странным образом:

  • mod_negotiation (с соответствующими Option Multiviews).После этого Apache пытается обслужить альтернативные файлы после обсуждения с заголовками браузеров.Это может сломать ваши RewriteRules или плохо взаимодействовать с другими модулями.Это обычно приводит к некоторым невнимательным ответам на некорректные запросы, я всегда удаляю этот модуль.
  • mod_include : Включения на стороне сервера (с соответствующими option Includes), также известные как SSI.Кому это действительно нужно?
  • mod_cache & mod_disk_cache на самом деле, это очень старые школьные вещи, вам лучше попробовать использовать Varnish или любые другие кеши обратного прокси
  • mod_rewrite : швейцарский нож, но вы уверены, что не написали где-то очень странное правило?
  • mod_dir : проверьте, что нетиметь DirectorySlash Off, который может плохо взаимодействовать с другим модулем, делающим странные вещи
  • mod_isapi : чтение документа может привести вас к некоторым подсказкам.Мне кажется, что это экспериментальная поддержка, при большой нагрузке я уверен, что могут произойти странные вещи.
  • mod_proxy : удалите его, если он вам не нужен

ОБНОВЛЕНИЕ: (после деталей конфигурации) При чтении вашей конфигурации я увидел несколько небольших ошибок (не связанных):

  • <Directory /> Я не думаю, что это будетработать в Windows, поскольку ваш корень c: not /.Но я, возможно, ошибаюсь.По крайней мере, здесь вам не нужен allow from all, что совершенно небезопасно.
  • Если вы не используете файлы .htaccess, установите AllowOverride None везде, особенно в <Directory "C:">, чтобы избежать поиска этих файлов изкорневой каталог.

Теперь к вашей проблеме.Я не вижу никакой опции, связанной с mod_cache, в вашей конфигурации (но, возможно, у вас есть некоторые включенные файлы в подкаталогах конфигурации apache, которые используют директивы mod_cache. Если вы не используете ни одну из директив mod_cache , вы можете приостановить этот модульбез риска.

0 голосов
/ 17 февраля 2012

Если это периодически, справедливо предположить, что кто-то периодически удаляет и заменяет index.php.

Комментарии - это не требует саботажа. Если вы просто повторно внедрите какой-либо стиль приложений с работающим веб-сервером или восстановите резервную копию, есть время, когда Apache может увидеть этот каталог, но не файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...