Apache-2.2

apache2:為什麼 <LimitExcept> 參數會導致 virtualhost 標籤中出現“deny not allowed here”錯誤?

  • November 7, 2014

向stackoverflow提出了同樣的問題,但後來我認為它可能與這裡更相關。

VirtualHost標籤之間的 apache 的 httpd.conf 中,我將&lt;LimitExcept&gt;表達式如下:

&lt;VirtualHost *:80&gt;
ServerName geopreprod.xxx.com.tr

&lt;LimitExcept HEAD POST GET&gt;
    Deny from all
&lt;/LimitExcept&gt; 

 ProxyRequests Off
 ProxyPreserveHost On

 &lt;Proxy *&gt;
   Order deny,allow
   Allow from all
 &lt;/Proxy&gt;

 ProxyPass / http://XXXXXXXX...
 ProxyPassReverse / http://XXXXXXXX....
&lt;/VirtualHost&gt;

然後 apache web 伺服器無法啟動,並給出以下錯誤:

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

雖然它說&lt;LimitExcept&gt;可以在官方文件VirtualHost中的標籤中使用,但為什麼會出現此錯誤?

在 apache 文件中它說:

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

只要您的&lt;LimitExcept&gt;塊位於對Allow/Deny指令有效的上下文中,它就可以正常工作。

如果您嘗試將一個裸Deny規則直接放在&lt;VirtualHost&gt;上下文中,您會看到它以相同的方式被拒絕 -不允許在其中添加 a,因此在它們之間也不要添加&lt;VirtualHost&gt;a 。Deny``&lt;LimitExcept&gt;

但是,訣竅是&lt;LimitExcept&gt;和其他一些塊類型,例如&lt;IfModule&gt;,不要修改指令的上下文;您永遠不會在指令文件的可接受上下文列表中看到“限制”。

只有四種上下文可以決定是否允許指令:

  • 伺服器配置
  • 虛擬主機
  • 目錄(也包括&lt;Location&gt;&lt;Files&gt;類型指令)
  • .htaccess

mod_authz_host指令(OrderAllowDeny)的情況下,它們只允許在目錄和 htaccess 上下文中,所以當它們不在一個中時它們總是會出錯。

在您的情況下,此反向代理虛擬主機沒有文件系統位置,因此您需要使用一個&lt;Location&gt;塊(這是Allow/的有效上下文,Deny因為它是目錄上下文類型):

&lt;Location /&gt;
   Order allow,deny
   Allow from all
   &lt;LimitExcept HEAD POST GET&gt;
       Deny from all
   &lt;/LimitExcept&gt;
&lt;/Location&gt;

哦,擺脫那個&lt;Proxy *&gt;塊,因為它什麼也沒做 -&lt;Location&gt;無論如何優先於它,但它與&lt;LimitExcept&gt;’s 的限制相衝突……所以這讓我很緊張。

引用自:https://serverfault.com/questions/356493