我已经问过同样的问题到 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>
有效的上下文内,它就能正常工作。Allow
Deny
如果您尝试将一条裸Deny
规则直接放在<VirtualHost>
上下文中,您会发现它以同样的方式被拒绝 -其中<VirtualHost>
带有 aDeny
是不允许的,因此<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>
哦,去掉那个<Proxy *>
块,因为它什么也没做 -<Location>
无论如何都优先于它,但它与的限制相冲突<LimitExcept>
......所以这让我很紧张。
答案2
错误消息表明在块Deny
中不允许这样做<LimitExcept>
。
从文档的不同部分:“mod_authz_host 提供的指令用于<Directory>
、<Files>
和<Location>
部分以及 .htaccess 文件”。