apache2:為什麼 <LimitExcept> 參數會導致 virtualhost 標籤中出現“deny not allowed here”錯誤?
我向stackoverflow提出了同樣的問題,但後來我認為它可能與這裡更相關。
在
VirtualHost
標籤之間的 apache 的 httpd.conf 中,我將<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
只要您的
<LimitExcept>
塊位於對Allow
/Deny
指令有效的上下文中,它就可以正常工作。如果您嘗試將一個裸
Deny
規則直接放在<VirtualHost>
上下文中,您會看到它以相同的方式被拒絕 -不允許在其中添加 a,因此在它們之間也不要添加<VirtualHost>
a 。Deny``<LimitExcept>
但是,訣竅是
<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>
哦,擺脫那個
<Proxy *>
塊,因為它什麼也沒做 -<Location>
無論如何優先於它,但它與<LimitExcept>
’s 的限制相衝突……所以這讓我很緊張。