Apache的<Directory>块不直接支持<Limit>指令,2.4+中已废弃;应使用<LimitExcept>配合Require实现方法控制,如<LimitExcept GET POST>Require all denied</LimitExcept>并补Require all granted。

Apache 的 <Directory> 块本身不直接支持 Limit 指令,尤其在 Apache 2.4+ 版本中,<Limit> 已被正式废弃,且不能嵌套在 <Directory> 内使用。若强行写入,httpd -t 会报错,服务无法启动。
真正可行、标准、安全的做法是:在 <Directory> 内使用 <LimitExcept> + Require 组合,实现对 HTTP 方法的显式放行或拦截。
✅ 正确写法:用 <LimitExcept> 控制允许的方法
<Directory "/var/www/example.com/public_html/api">
# 只允许 GET 和 POST,其他方法(如 PUT、DELETE、TRACE)全部拒绝
<LimitExcept GET POST>
Require all denied
</LimitExcept>
# 其他必要授权(如允许访问)
Require all granted
</Directory>⚠️ 注意:
-
<LimitExcept>是容器指令,必须配合Require才生效; -
Require all denied表示“未被<LimitExcept>列出的方法一律拒绝”; -
Require all granted是对已允许方法的访问放行(不能省略,否则连 GET/POST 也会被拒); - 该配置仅作用于该目录及其子目录下的所有资源。
❌ 常见错误写法(会导致启动失败)
# 错误1:Apache 2.4+ 不支持 <Limit>,语法过时
<Limit DELETE PUT>
Deny from all
</Limit>
# 错误2:把 Limit 放在 Directory 里,且没 Require
<Directory "/path">
<LimitExcept GET>
# 缺少 Require 指令 → 默认拒绝所有,包括 GET
</LimitExcept>
</Directory>Apache 2.4+ 的授权模型完全基于 Require,旧版 Order/Allow/Deny 或裸 <Limit> 都不再有效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
? 进阶建议:结合路径与方法做更细粒度控制
如果只想限制某类接口(比如只禁用 /api/v1/ 下的 DELETE),推荐用 <Location> 替代 <Directory>,更精准匹配 URL 路径:
<Location "/api/v1/">
<LimitExcept GET POST HEAD OPTIONS>
Require all denied
</LimitExcept>
Require all granted
</Location><Location> 按 URI 匹配,不受文件系统路径限制,更适合 REST API 场景。
? 验证是否生效
- 重启 Apache:
sudo systemctl reload apache2 - 测试非法方法:
curl -X DELETE http://example.com/api/test # 应返回 405 Method Not Allowed
- 查看运行时配置:
apache2ctl -t -D DUMP_RUN_CFG | grep -A5 "Directory.*api"
不复杂但容易忽略

















