apache2:为什么<LimitExcept>参数结果“拒绝不允许在这里”的虚拟主机标记错误?

我已经提出了相同的问题stackoverflow,但后来我认为这可能是更多的相关在这里。

在apache的httpd.conf中的VirtualHost标签之间,我把<LimitExcept>expression式如下:

 <VirtualHost *:80> ServerName geopreprod.xxx.com.tr <LimitExcept HEAD POST GET> Deny from all </LimitExcept> ProxyRequests Off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://XXXXXXXX... ProxyPassReverse / http://XXXXXXXX.... </VirtualHost> 

然后apache web服务器无法启动提供以下错误:

 Syntax error on line 513 of XXXXX/httpd.conf: deny not allowed here 

虽然它说<LimitExcept>可以在主题文档中的VirtualHost标签中使用,为什么我会得到这个错误?

在Apache文档中说:

 Context: server config, virtual host, directory, .htaccess 

只要你的<LimitExcept>块在一个对Allow / Deny指令有效的上下文中,那么它将工作得很好。

如果你试图直接在<VirtualHost>上下文中直接使用Deny规则,你会发现它被拒绝了,同样的,拒绝它的<VirtualHost>也是不允许的,所以在它们之间不要添加一个<LimitExcept>

但是,诀窍在于<LimitExcept>和其他一些块types(如<IfModule> )不会修改指令的上下文; 在指令的文档中,您永远不会在可接受的上下文列表中看到“限制”。

只有四个上下文可以决定是否允许指令:

  • 服务器configuration
  • 虚拟主机
  • 目录(也包括<Location><Files>types指令)
  • 的.htaccess

mod_authz_host指令( OrderAllowDeny )的情况下,它们只允许在目录和htaccess上下文中,所以当它们不在一个时,它们总是会出错的。

在你的情况下,这个反向代理虚拟主机没有文件系统的位置,所以你需要使用<Location>块(这是一个Allow / Deny的有效上下文,因为它是目录上下文types):

 <Location /> Order allow,deny Allow from all <LimitExcept HEAD POST GET> Deny from all </LimitExcept> </Location> 

呵呵,摆脱那个<Proxy *>块,因为它什么都不做, <Location>优先于它,但它与<LimitExcept>的限制冲突,所以它让我感到紧张。

错误消息是说Deny不允许在<LimitExcept>块中。

从文档的不同部分: “mod_authz_host提供的指令用于<Directory><Files><Location>部分以及.htaccess文件中。