我无法让 Apache 识别 VirtualHost 块内的 Options 指令。以下代码片段是我所能做的最简单的代码,它将重现错误 - 其余配置是现有的 Deiban Apache 2.4。
<VirtualHost *:80>
ServerName example
DocumentRoot /home/test/ #owner www-data:www-data
Options +Indexes
<Location />
Require all granted
</Location>
</VirtualHost>
这将失败并出现 403 Forbidden 错误,相应日志中会出现以下行:
[Sun Jun 26 15:06:30.378689 2016] [autoindex:error] [pid 15899:tid 140693629712128] [client 192.168.0.155:52850] AH01276: Cannot serve directory /home/test/: No matching DirectoryIndex (index.html,index.cgi,index.pl,index.php,index.xhtml,index.htm) found, and server-generated directory index forbidden by Options directive
然而,将Options +Indexes
指令放在容器内<Location />
将会修复它并且将提供自动生成的索引。
我想知道为什么必须将其放在里面<Location />
才能工作,而不仅仅是<VirtualHost>
。Apache 2.4 文档说该Options
指令可以放在以下上下文中[1]
上下文:服务器配置、虚拟主机、目录、.htaccess
那么为什么它在里面不工作呢VirtualHost
?
编辑#1
输出apachectl -S
AH00557: apache2: apr_sockaddr_info_get() failed for garnet
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
VirtualHost configuration:
*:80 garnet.cat (/etc/apache2/sites-enabled/test.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex watchdog-callback: using_defaults
Mutex proxy: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
关于Options
配置文件中其他地方可能的其他指令:
我找不到任何内容。我曾经在配置文件中root@garnet:/etc/apache2# grep -P -Rni '\soptions\s' .
查找该指令的出现。所有匹配项都在注释字符串或不相关的块中。无论如何,Options
<Directory>
VirtualHost 块不会覆盖其外部指定的指令?
答案1
这很可能是一个合并问题,详细信息如下:http://httpd.apache.org/docs/current/sections.html#merging
因此,一般来说,更具体的配置部分行Directory
和Location
位置可以覆盖虚拟主机级别的配置,而虚拟主机级别的配置又可以覆盖全局级别的配置。但是,当您深入到更具体的配置块时,它们是如何处理的,如上面的链接所述。
这些级别在 Apache 术语中被称为上下文,熟悉上下文的含义是一个好主意,呃...好吧...上下文 :-)。更多信息请见此处:http://httpd.apache.org/docs/current/mod/directive-dict.html#Context
正如评论中所提到的,在全局上下文中寻找可能与Location
您LocationMatch
的 URI 路径匹配的块,或者Directory
可能DirectoryMatch
匹配的块,/home/test/
或者目录树中位于其上方的任何内容。