Apache:Options指令禁止的目录索引

时间:2011-08-16 12:01:18

标签: apache caching apache2

我们在Windows Server 2008 R2 VPS上运行4个Wordpress网络安装,使用Apache 2.2.17和PHP 5.3.10,由于某些原因,我们经常得到此(示例)错误:< / p>

错误日志

[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)"

错误“目录索引禁止”通常意味着尝试访问目录,但没有要显示的文件(根据options指令),禁止目录列表。然而,这不是这种情况。该错误指的是文件夹C:/_webserver/_www/wp/www/,它是项目的webroot,并且始终具有index.php。此外,httpd.conf设置为:DirectoryIndex index.html index.php

看到Apache中出现错误的方式,我认为这不太可能是由PHP或Wordpress引起的。

困难的是我们不知道如何重现错误,因此我们很难对此进行测试。

我们可以做些什么来找出问题所在?它与Apache的设置有什么关系(看起来像一个多余的问题)。它与Apache已经读取的文件有什么关系吗?我们有什么方法可以获得有关此问题的更多信息吗?

我欢迎任何帮助,以帮助我解决这个令人讨厌的案件。

更新

这些是我目前使用的模块

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 个答案:

答案 0 :(得分:4)

这肯定是难以调试的,偶尔的错误是最糟糕的: - )

我的第一个想法是“内部dumy连接”相关问题,但这不会向您显示access.log中的IE8-beta签名。

所以我找到了三个你可以调查的链接:

由此我认为这种问题有点像药物相互作用。所以首先要做的是:

  1. 检查你的apache配置中加载的模块并删除(注释加载行)你根本不需要的模块(如果你以前从未这样做过,那么你将拥有更快的Apache!)。
  2. 为您仍在生产中使用的模块构建测试环境(删除它会导致应用程序崩溃)。您需要能够使用wgetab或任何其他大量HTTP请求工具重现该错误。
  3. 逐个尝试激活模块,直到问题消失。
  4. 通常会产生奇怪行为的模块是:

    • mod_negotiation (与相关的Option Multiviews)。然后,在与浏览器标头进行协商之后,Apache正在尝试提供备用文件。这可能会破坏您的RewriteRules或与其他模块进行严重交互。这通常会导致对格式错误的查询做出一些无条件的响应,我总是删除该模块。
    • mod_include :服务器端包含(带有相关的option Includes),也称为SSI。谁真的需要那个?
    • mod_cache &amp; mod_disk_cache ,真的,这是一个很老的学校的东西,你最好尝试使用Varnish或任何其他反向代理缓存
    • mod_rewrite :瑞士刀,但你确定你没有在某个地方写过一个非常奇怪的规则吗?
    • mod_dir :检查您没有DirectorySlash Off,这可能会与其他模块做出奇怪的事情相互影响
    • mod_isapi :阅读the doc可能会引导您一些提示。对我来说,我觉得这是一个实验性的支持,在重载时我很确定会发生奇怪的事情。
    • mod_proxy :如果您不需要,请将其删除

    更新:(在配置详细信息之后) 阅读你的配置我看到了几个小错误(无关):

    • <Directory />我认为这不适用于Windows,因为你的root是c:not /。但我可能错了。至少你在这里不需要allow from all,非常不安全。
    • 如果您不使用.htaccess文件,请在任何地方设置AllowOverride None,尤其是在<Directory "C:">中,以避免从根目录中搜索这些文件。

    现在为您解决问题。我没有在你的配置中看到任何与mod_cache相关的选项(但是你可能在使用mod_cache指令的apache配置的子目录中有一些包含的文件。如果你不使用任何mod_cache directives,你可以暂停该模块而没有任何风险

答案 1 :(得分:0)

如果它是间歇性的,那么可以猜测有人间歇地删除并替换index.php。

评论 - 这不需要'破坏'。如果您只是使用正在运行的Web服务器重新部署某些样式的应用程序,或者还原备份,那么Apache可能会看到此目录但没有文件的时间窗口。