在 nginx.conf 中为每个 location 配置独立访问策略,核心是利用 location 块的隔离性与内置指令组合实现权限、限流、来源控制等差异化管控,关键在于按需嵌套指令而非简单加开关。

在 nginx.conf 中为每个 location 配置独立访问策略,核心是利用 location 块的隔离性与内置指令组合实现权限、限流、来源控制等差异化管控。关键不在“加开关”,而在“按需嵌套指令”。
按路径精准控制访问权限
每个 location 可独立启用认证、IP黑白名单或拒绝所有请求:
-
基础拒绝:用
deny all;直接拦截,适合内部接口或维护路径
location /admin/api/ { deny all; } -
IP 白名单:配合
allow/deny(注意顺序,deny all必须放最后)
location /backup/ { allow 192.168.10.5; deny all; } -
HTTP Basic 认证:仅该路径生效,不影响其他 location
location /private/ { auth_basic "Restricted Area"; auth_basic_user_file /etc/nginx/.htpasswd; }
对静态资源单独限速和缓存
图片、JS、CSS 等资源常需与动态接口区别对待:
-
速率限制:定义独立限流 zone,只作用于匹配路径
limit_req_zone $binary_remote_addr zone=static:10m rate=10r/s;
location ~* \.(js|css|png|jpg|gif)$ { limit_req zone=static burst=20 nodelay; } -
强缓存控制:设置不同过期时间,避免全局
expires干扰
location /assets/ { expires 1y; add_header Cache-Control "public, immutable"; }
按请求特征做条件拦截
结合 if(谨慎使用)、map 或正则,实现细粒度策略:
-
禁止特定 User-Agent 访问某路径
location /api/v1/ { if ($http_user_agent ~* "sqlmap|nikto") { return 403; } } -
根据 Referer 控制资源外链
location ~* \.(pdf|docx)$ { valid_referers none blocked example.com; if ($invalid_referer) { return 403; } } -
用 map 动态赋值后统一处理(更推荐,性能优于 if)
map $uri $is_protected { ~^/internal/ 1; default 0; }
location / { if ($is_protected) { deny all; } }
注意事项与避坑点
独立策略有效,但配置逻辑必须清晰,否则易引发冲突:
-
匹配顺序决定策略是否生效:精确匹配(
=)和前缀匹配(^~)优先级高,应放在前面;正则匹配(~)按文件中顺序执行,靠后定义可能被跳过 -
root 与 alias 不可混用:涉及文件系统路径时,
alias要求结尾带斜杠且不拼接 URI,root会自动拼接,错用导致 404 -
return/rewrite 影响后续 location 匹配:如用
rewrite ... last,Nginx 会重新匹配 location;用break则在当前块内继续执行,不重匹配











