apache拦截http方法应分层处理:优先用traceenable off协议级禁用trace/track;再用白名单控制常规方法,须显式包含head和options;mod_rewrite可作补充,但避免与前者混用。

Apache 的 ServerName 指令本身不参与请求方法拦截,它只用于标识虚拟主机的默认域名,和 HTTP 方法(如 GET、POST、TRACE)完全无关。真正负责拦截特定请求方法的,是其他配置机制——必须用对位置、选对模块、分清协议级与访问控制层。
✅ 优先用 TraceEnable off 关闭高危方法
这是最底层、最安全的方式,专为 TRACE 和 TRACK 设计:
- 在
<virtualhost></virtualhost>块或服务器全局配置中直接写:TraceEnable off
- 它在协议解析阶段就禁用,不经过路由、不触发模块、无法绕过。
-
不能放在
.htaccess或<directory></directory>里,只支持服务器级或虚拟主机级。
✅ 用 <limitexcept></limitexcept> 控制常规方法访问权限
适合精细放行 GET、HEAD、POST 等,拒绝其余方法:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
<limitexcept get head post>
Require all denied
</limitexcept>
注意三点:
- 必须显式包含
HEAD:缓存验证、健康检查依赖它,漏掉会导致 405 错误。 - 若站点需 CORS,
OPTIONS也得加进白名单,否则预检失败。 -
Require必须包裹在<requireall></requireall>或<requireany></requireany>内(Apache 2.4+ 推荐写法)。
✅ 用 mod_rewrite 补充拦截(兼容或增强场景)
当需要统一拦截多个非标准方法(如 DELETE、PUT、自定义方法),或 TraceEnable 不可用时使用:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|DEBUG|CONNECT|OPTIONS)
RewriteRule ^ - [F]
-
[F]返回 403 Forbidden,比 405 更明确表示“禁止”,且不暴露服务支持的方法列表。 - 规则生效早于
<limitexcept></limitexcept>,但两者叠加易冲突,建议统一用一种机制收口。
❌ 别误用 ServerName 或限流指令来“拦截方法”
-
ServerName example.com只影响虚拟主机匹配,对请求方法无任何过滤作用。 -
LimitRequestFields和LimitRequestFieldSize是防请求头膨胀的,不是防高频或非法方法。 -
mod_evasive或mod_ratelimit是按 IP/路径限频,不能原生区分方法类型——除非配合SetEnvIf标记再触发,但那属于“限流”,不是“拦截”。
? 验证是否生效
- 用
curl -X TRACE https://yoursite.com/测试,应返回 403 或连接拒绝。 - 用
telnet yoursite.com 80手动发TRACE / HTTP/1.1(空行两次),看响应状态码。 - 跨域页面中检查浏览器 Network 面板,确认
OPTIONS请求能正常返回 200/204。










