LimitExcept 必须嵌套在 、、 或 .htaccess 中才生效,不可直接置于 顶层;推荐用 包裹 DocumentRoot 路径,并配合 Require all denied 实现方法白名单控制。在虚拟主机层级配置 `LimitExcept` 指令,不能直接写在 `
必须放在 Directory 容器内才生效
apache 明确限制 `limitexcept` 的作用域。哪怕你只想限制整个虚拟主机的根目录行为,也得显式包裹一层 `
- 错误写法:
<virtualhost> LimitExcept GET HEAD ... </virtualhost> - 正确写法:
<directory><limitexcept get head> Require all denied </limitexcept></directory> - 若用 `.htaccess`,需确保父目录 `AllowOverride` 启用了 Limit(不是 All 或 None),否则指令被忽略
只放行 GET 和 HEAD 是最常见安全策略
静态资源站、CDN 回源目录、只读 API 接口等场景,通常只需响应读取请求。注意:`LimitExcept GET HEAD` 的含义是「除 GET 和 HEAD 外,其余方法一律拒绝」,逻辑是反向列举。
- 务必包含 HEAD:浏览器预检、缓存探针、健康检查常发 HEAD 请求,漏掉会导致 405 错误或缓存失效
- 默认不放行 OPTIONS:CORS 预检依赖它,如需跨域访问,必须显式加进白名单:
<limitexcept get head options></limitexcept> - TRACE 方法无需手动禁止:Apache 默认关闭(
TraceEnable off),即使没列在 LimitExcept 中也无法启用
结合 Require 实现条件化方法放行
单纯按方法限制不够灵活。比如“管理员可 POST,普通用户只能 GET”,就得在 `LimitExcept` 内嵌套 `Require` 规则。
- 示例:仅允许内网 IP 或已认证用户使用 POST:
<limitexcept get head><requireall> Require ip 10.0.0.0/8 Require valid-user </requireall></limitexcept> - 关键细节:`Require` 必须包在 `
` 或 ` ` 里,不能直接写在 `LimitExcept` 下 - 注意叠加效应:如果外层 `
` 已设 `Require valid-user`,它会和 `LimitExcept` 内规则共同生效,可能导致过度拦截,建议统一收口到 `LimitExcept` 块中
调试 405 Method Not Allowed 的关键步骤
返回 405 不代表配置语法错误,而是请求方法被明确拒绝。排查要按顺序来:
- 确认请求实际使用的 HTTP 方法(如 curl -X PUT /api/test 查看是否真发了 PUT)
- 检查该请求路径是否命中你配置的 `
` 范围(路径是否匹配、是否被更高优先级配置覆盖) - 验证 Apache 版本对应语法:2.4+ 用
Require all denied;2.2 用Deny from all,混用会报错










