apache2:为什么 <LimitExcept> 参数导致虚拟主机标签中的“此处拒绝不允许”错误?

des*_*tan 6 configuration web-server apache-2.2

我已经向 stackoverflow提出了同样的问题,但后来我认为它可能与此处更相关。

在 apache 的 httpd.confVirtualHost标签之间,我把<LimitExcept>表达式如下:

<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>
Run Code Online (Sandbox Code Playgroud)

然后 apache Web 服务器无法通过给出以下错误启动:

Syntax error on line 513 of XXXXX/httpd.conf:
deny not allowed here
Run Code Online (Sandbox Code Playgroud)

虽然它说<LimitExcept>可以VirtualHost官方文档的标签中使用为什么我会收到这个错误?

在 apache 文档中它说:

Context:    server config, virtual host, directory, .htaccess
Run Code Online (Sandbox Code Playgroud)

Sha*_*den 14

只要您的<LimitExcept>块位于对Allow/Deny指令有效的上下文中,它就会正常工作。

如果您尝试将裸Deny规则直接放在<VirtualHost>上下文中,您会看到它以相同的方式被拒绝 -不允许在其中<VirtualHost>使用 a Deny,因此也不<LimitExcept>在它们之间添加 a 。

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

只有四种上下文可以指示是否允许指令:

  • 服务器配置
  • 虚拟主机
  • 目录(也包括<Location><Files>类型指令)
  • .htaccess

mod_authz_host指令 ( Order, Allow, 和Deny)的情况下,它们只允许出现在目录和 htaccess 上下文中,因此当它们不在一个上下文中时,它们总是会出错。

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

<Location />
    Order allow,deny
    Allow from all
    <LimitExcept HEAD POST GET>
        Deny from all
    </LimitExcept>
</Location>
Run Code Online (Sandbox Code Playgroud)

哦,摆脱那个<Proxy *>块,因为它没有做任何事情 -<Location>无论如何都优先于它,但它与<LimitExcept>的限制相冲突..所以这让我很紧张。