首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache: Options指令禁止的目录索引

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

Stack Overflow用户
提问于 2011-08-16 12:01:18
回答 2查看 9.7K关注 0票数 7

我们正在Windows 2008 R2 VPS上运行4个Wordpress网络安装程序,Apache2.2.17和PHP5.3.10,出于某种原因,我们经常使用获取以下错误(示例):

错误日志

代码语言:javascript
复制
[Thu Feb 16 15:01:59 2012] [error] [client x.x.x.x] Directory index forbidden by Options directive: C:/_webserver/_www/wp/www/

访问日志

代码语言:javascript
复制
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已经读取的文件有任何关系吗?有什么方法可以让我们获得更多关于这个问题的信息吗?

我欢迎任何帮助来帮助我解决这个恶心的案子。

更新

这些是我目前正在使用的模块。

代码语言:javascript
复制
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"

备选指令:

代码语言:javascript
复制
<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如下所示:

代码语言:javascript
复制
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的设置有点有限。

代码语言:javascript
复制
# 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缓存,从那时起,就不再有错误了。不幸的是,这周我没有太多的时间做适当的测试,但至少我知道问题的所在。在服务器不那么繁忙的情况下,暂时不需要缓存。我可能会回来一段时间:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-19 10:16:45

这当然是很难调试的,偶尔的错误是最糟糕的:-)

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

所以我发现了三个你可以调查的链接:

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

  1. 检查您的apache配置中加载的模块,并删除(注释加载线)您根本不需要的模块(如果您以前从未这样做,那么您将拥有一个更快的Apache!)
  2. 为生产中仍然使用的模块构建一个测试环境(在这里,删除它会使应用程序崩溃)。您需要能够使用wgetab或任何其他大规模的HTTP工具再现该bug。
  3. 一个接一个地尝试不活动模块,直到问题消失。

通常会产生奇怪行为的模块有:

  • mod_negotiation (与相关的Option Multiviews)。然后,Apache试图在与浏览器头进行重新定位之后,提供备用文件。这可能会破坏您的RewriteRules或与其他模块交互不良。这通常会导致对格式错误的查询不加注意的响应,我总是删除该模块。
  • mod_include:服务器端包括(以及相关的option Includes),也称为SSI。谁真的需要那个?
  • mod_disk_cachemod_cache,真的,这是一个非常古老的东西,你最好尝试使用Varnish或其他任何反向代理缓存
  • mod_rewrite:瑞士刀,但你确定你没有写一个非常奇怪的规则某处?
  • mod_dir:检查您没有DirectorySlash Off,它可能与执行奇怪事情的其他模块交互很糟糕
  • mod_isapi:阅读医生可能会给您带来一些提示。对我来说,我觉得这是一个实验性的支持,在沉重的负荷下,我很肯定会发生奇怪的事情。
  • mod_proxy:如果不需要就删除它

更新:(配置细节之后)阅读您的配置我看到了几个小错误(无关):

  • <Directory /> --我认为这在Windows上行不通,因为你的根目录是c:而不是/。但我可能错了。至少这里不需要allow from all,非常不安全。
  • 如果不使用.htaccess文件,则可以在任何地方设置AllowOverride None,特别是在<Directory "C:">中,以避免从根目录中查找这些文件。

现在轮到你了。我在您的配置中没有看到任何与mod_cache相关的选项(但是您可能在apache的子目录中包含了一些使用mod_cache指令的文件。如果您不使用任何缓存指令,则可以在没有任何风险的情况下挂起该模块。

票数 4
EN

Stack Overflow用户

发布于 2012-02-17 12:41:53

如果是断断续续的,那么可以猜到有人在断断续续地删除和替换index.php。

关于评论-这不需要‘破坏’。如果您只是使用正在运行的see服务器重新部署某种类型的应用程序,或者还原备份,那么Apache可能会看到这个目录,但没有文件,这是一个时间窗口。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7077894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档