Nginx 中限制请求方法最常用方式是 limit_except 指令,用于白名单允许指定方法,仅允许列出的方法访问,其余返回 405;也可用 if + $request_method 黑名单拦截特定方法,但官方推荐优先使用 limit_except。

在 Nginx 的 server 或 location 块中限制请求方法,最常用、最直接的方式是使用 limit_except 指令。
用 limit_except 白名单允许指定方法
该指令定义「除列出的方法外,其他所有方法均被拒绝」,适合只允许 GET/HEAD(或加 POST)等少数安全操作的场景:
server {
listen 80;
server_name example.com;
<pre class='brush:php;toolbar:false;'>location /api/ {
limit_except GET HEAD {
deny all;
}
# 其他配置,如 proxy_pass
proxy_pass http://backend;
}}
上面配置表示:仅允许 GET 和 HEAD 请求访问 /api/,其余如 POST、PUT、DELETE 等一律返回 405 Method Not Allowed。
支持的方法包括:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS、PROPFIND、PROPPATCH、LOCK、UNLOCK、PATCH、TRACE。
用 if + $request_method 黑名单拦截特定方法
当需要明确禁止某些危险方法(比如禁用 PUT 和 DELETE),而不限制其他方法时,可用 if 判断:
location /admin/ {
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) {
return 405;
}
# 后续处理...
}
注意:if 在 location 中虽可用,但应避免嵌套复杂逻辑;Nginx 官方建议优先用 limit_except 实现白名单控制。
补充说明与常见误区
-
limit_except只能出现在location块内,不能直接写在server或http块中 - 它隐式包含
GET和HEAD—— 即使没写,这两个方法也默认允许(除非显式排除) - 返回状态码固定为
405 Method Not Allowed,不可自定义;如需返回403或重定向,得用if + return - 若同时用了
limit_except和allow/deny,权限控制以更严格的为准,但通常不混用


















