nginx可通过http块中auth_request全局启用统一鉴权,配合/_auth internal接口、error_page跳转及auth_request off豁免登录页/静态资源等路径,实现安全可控的网关级认证。

直接在 http 块里用 auth_request 实现全局统一身份验证,核心是把鉴权逻辑“收口”到网关层,所有请求(无论路径)都先过一道认证检查,而不是在每个 location 里重复配置。
全局启用 auth_request 的关键配置
在 http 块顶层定义一个默认的鉴权入口,并通过 auth_request 指令设为默认行为:
- 添加
auth_request /_auth;到http块,这样所有未显式关闭该指令的 location 都会自动触发鉴权 - 配合
auth_request_set $user $upstream_http_x_user;提前提取认证服务返回的用户标识 - 用
proxy_set_header X-User $user;把用户信息透传给后端,避免每个 location 单独写 - 确保
/_authlocation 带internal;,禁止外部直连,且只做轻量转发
覆盖例外路径:静态资源与登录页不鉴权
不是所有路径都需要验证。必须显式关闭 auth_request 的地方包括:
- 登录接口(如
/login、/oauth/authorize),否则用户永远进不来 - 公开静态资源(如
/assets/、/health、/favicon.ico) - 前端打包后的
/index.html和 SPA 路由 fallback,否则 Vue/React 路由会 401 - 在对应 location 中加
auth_request off;即可,优先级高于 http 块的默认设置
透传上下文给认证服务
全局鉴权时,认证服务需要知道“谁在访问什么”,Nginx 必须稳定透传关键信息:
-
X-Original-URI和X-Original-Method:让认证服务判断是否具备该路径+方法的权限 -
Authorization头:需在/_authlocation 显式写proxy_set_header Authorization $http_authorization;,因为 Nginx 默认不透传 -
Cookie:若走 Session 登录(如 SSO),加proxy_pass_request_headers on;并确保认证服务能识别该 Cookie - 避免带请求体:
proxy_pass_request_body off;+proxy_set_header Content-Length "";,除非认证接口明确需要 POST body
失败响应要导向登录页,而非裸状态码
返回 401 给前端会导致页面白屏或报错,应由 Nginx 主动跳转:
- 在
http块加error_page 401 =302 https://auth.example.com/login?redirect_uri=$scheme://$host$request_uri; - 如果认证服务返回 403,同样配
error_page 403 =302 ...或返回自定义拒绝页 - 确保登录页本身在 location 中已设
auth_request off;,形成闭环 - 对
/login后的回调地址(如/callback)也要豁免鉴权










