apache2:为什么参数结果“此处不允许拒绝”虚拟主机标签中的错误?

apache2:为什么参数结果“此处不允许拒绝”虚拟主机标签中的错误?

我已经问过同样的问题到 stackoverflow但后来我认为这可能与这里更相关。

在 apache 的 httpd.conf 中的VirtualHost标签之间我放置了<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>

然后 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

答案1

只要您的块位于对/指令<LimitExcept>有效的上下文内,它就能正常工作。AllowDeny

如果您尝试将一条裸Deny规则直接放在<VirtualHost>上下文中,您会发现它以同样的方式被拒绝 -其中<VirtualHost>带有 aDeny是不允许的,因此<LimitExcept>在它们之间也不允许添加 a。

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

只有四种情况可以决定是否允许某个指令:

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

对于mod_authz_host指令(OrderAllowDeny)而言,它们仅允许出现在目录和 htaccess 上下文中,因此当它们不在其中时,它们总是会出错。

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

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

哦,去掉那个<Proxy *>块,因为它什么也没做 -<Location>无论如何都优先于它,但它与的限制相冲突<LimitExcept>......所以这让我很紧张。

答案2

错误消息表明在块Deny中不允许这样做<LimitExcept>

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

相关内容