应使用 limit_except 指令在静态资源 location 块中显式允许 GET 和 HEAD,其余方法自动返回 405;备选方案为 if 判断 $request_method 并 return 405,但需避免在 server 或 http 块顶层使用 if。

要限制 Nginx 对静态资源(如 .js、.css、.png 等)仅响应 GET 和 HEAD 请求,其他方法(如 POST、PUT、DELETE)应直接拒绝,核心是使用 limit_except 指令或配合 if + return 实现。
推荐方式:用 limit_except 限定静态 location
这是最清晰、语义明确且安全的做法。它专为限制 HTTP 方法设计,不会触发 if 的潜在陷阱:
- 在匹配静态资源的
location块中添加limit_except块 - 显式允许
GET和HEAD,其余方法自动返回405 Method Not Allowed - 无需手动判断
$request_method,更可靠
示例配置:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
<pre class="brush:php;toolbar:false;">limit_except GET HEAD {
deny all;
}}
备选方式:用 if + return 显式拦截
若因历史原因需更精细控制(例如统一日志或自定义响应头),可用 if 判断请求方法,但注意:只能在 location 内使用,且不能嵌套,也不支持 break 或 rewrite:
- 检查
$request_method是否不在允许列表中 - 匹配即返回
405,并可附加Allow响应头提升兼容性 - 确保该
if在location最外层,避免被其他指令覆盖
示例:
location ~* \.(js|css|png|jpg|gif|svg|woff2?|ttf|eot)$ {
expires 1y;
<pre class="brush:php;toolbar:false;">if ($request_method !~ ^(GET|HEAD)$) {
return 405;
}
add_header Allow "GET, HEAD";}
关键细节与避坑提醒
-
limit_except只支持allow和deny,不支持return或rewrite,但对本场景已足够 - 正则
location中的~*表示忽略大小写,覆盖常见静态后缀(如.JPG) - 不要在
server或http块顶层用if判断方法——Nginx 官方明确不推荐,易引发意外行为 - 测试时用
curl -X POST http://example.com/style.css验证是否返回405
扩展建议:配合日志区分非法请求
可为被拒绝的请求单独记录,便于审计:
- 定义一个专用日志格式,标记方法和状态码
- 在
limit_except或if所在location中添加access_log /var/log/nginx/static-method-deny.log method_deny; - 避免污染主访问日志,便于排查误配或扫描行为











