RewriteCond 通过 %{REQUEST_METHOD} 变量匹配 HTTP 方法,配合 RewriteRule 实现条件拦截或重定向;例如用 !^(GET|POST)$ 拒绝非 GET/POST 请求并返回 405 状态码。

Apache 的 RewriteCond 本身不能直接“限制”或“拒绝”请求方法,但它可以**匹配**当前请求的 HTTP 方法(如 GET、POST),再配合 RewriteRule 实现条件拦截或重定向。关键点是:mod_rewrite 不感知方法语义,只读取 %{REQUEST_METHOD} 变量值做字符串判断。
用 RewriteCond 匹配 GET 或 POST
只需一条条件即可判断请求是否为 GET 或 POST:
RewriteCond %{REQUEST_METHOD} ^(GET|POST)$ [NC]
说明:
^ 和 $ 确保完全匹配,避免把 GETX 或 POSTED 误判;[NC] 表示不区分大小写,兼容大写(GET)和小写(get)写法;
这个条件常用于“放行”逻辑——只有满足时才执行后续规则。
拦截非 GET/POST 请求(返回 405)
若想对 PUT、DELETE、PATCH 等方法直接拒绝,可这样写:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{REQUEST_METHOD} !^(GET|POST)$ [NC]RewriteRule ^ - [R=405,L]
说明:! 表示“非”;^ - 表示不改路径,只响应;[R=405,L] 返回标准的 “Method Not Allowed” 状态码,并终止处理。
结合路径做精细化控制
比如只对 /api/submit 路径限制方法,其他路径不限制:
RewriteCond %{REQUEST_URI} ^/api/submit$RewriteCond %{REQUEST_METHOD} !^(GET|POST)$ [NC]RewriteRule ^ - [R=405,L]
注意:多个 RewriteCond 默认是 AND 关系,必须同时满足才触发规则。
常见误区提醒
不能靠 mod_rewrite 实现 RESTful 方法路由分发——它只负责前置判断;真正的方法分发(如 GET /users → list,POST /users → create)必须由后端 PHP/Node 等程序根据 $_SERVER['REQUEST_METHOD'] 和路径解析完成。
也不要试图用 RewriteRule 单独匹配方法,它只匹配 URI path,不读取请求方法。

















