Apache的块本身不直接限制HTTP方法,但可通过容器配合Require指令实现精细控制:如仅允许GET/POST,其余方法拒绝;必须搭配Require all denied等授权指令,且需置于内,Apache 2.4+默认支持。

Apache 的 <directory></directory> 块本身不直接限制 HTTP 请求方法(如 GET、POST、PUT 等),但可以通过 <limit></limit> 或更推荐的 <limitexcept></limitexcept> 容器配合 Require 指令,在目录级实现对请求方法的精细控制。
用 允许/禁止特定方法
这是最常用、语义清晰的方式:指定哪些方法**不允许**(即只允许列出的方法),其余一律拒绝。
-
<limitexcept get head></limitexcept>:只允许 GET 和 HEAD,拒绝 POST、PUT、DELETE 等所有其他方法 -
<limitexcept get post></limitexcept>:允许 GET 和 POST,其他方法返回 405 Method Not Allowed - 容器内必须搭配授权指令,否则默认拒绝 —— 通常写
Require all denied或Require all granted
示例:仅允许静态资源被读取,禁用写入类操作
<directory>
Options -Indexes
AllowOverride None
Require all granted
<limitexcept get head options>
Require all denied
</limitexcept></directory>
用 显式控制某几个方法
与 <limitexcept></limitexcept> 相反,<limit></limit> 是“只对列出的方法生效”,未列出的方法不受该块约束(由外层权限决定)。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 适合需要为 POST 单独设限(如限 IP 或认证),而 GET 保持开放的场景
- 必须配合
Require使用,例如:<limit post> Require ip 10.0.0.0/8 </limit> - 注意:如果外层已设
Require all granted,而<limit post></limit>内没写Require,则 POST 实际仍被允许
结合 FilesMatch 对特定文件类型进一步收紧
仅靠方法限制不够安全 —— 比如允许 POST 到 .php 文件就可能引发风险。建议叠加文件级拦截:
- 在上传目录中禁止执行脚本,同时限制方法:
<filesmatch> Require all denied </filesmatch> - 对配置文件(如
.env、config.ini)直接拒所有方法:<files> Require all denied </files>
注意事项
这些指令需放在 <directory></directory> 块内,且 Apache 2.4+ 必须启用 mod_authz_core(默认已加载)。<limit></limit> 和 <limitexcept></limitexcept> 不支持嵌套,也不继承父目录设置,每个块独立生效。调试时可用 curl -X PUT http://yoursite/test.txt 验证是否返回 405。









