Nginx 的 return 指令用于立即终止请求处理并返回指定状态码或重定向,不执行后续配置;支持 return 状态码、return 状态码 文本、return 状态码 URL 三种语法,常用于 301/302 跳转、403/503 拦截及维护页,优先级高、性能优,但不可在 http 块顶层使用,且在 if 中需谨慎。

Nginx 的 return 指令用于在处理请求时立即终止当前处理流程,并直接返回指定的状态码或响应内容,不经过后续 location、proxy_pass 或其他模块处理。它常用于简单重定向、拒绝访问、维护页跳转等场景。
基本语法和常见用法
return 指令支持两种主要形式:
-
仅返回状态码:如
return 403;或return 503;,Nginx 会返回对应状态码及默认错误页(如 403.html) -
返回状态码 + 自定义文本/重定向 URL:
-
return 200 "Hello, Nginx!";→ 返回纯文本响应(需确保Content-Type: text/plain,否则浏览器可能乱码) -
return 301 https://example.com$request_uri;→ 永久重定向,支持变量拼接 -
return 302 /maintenance.html;→ 临时重定向到本地路径(注意:不是内部重写,是 HTTP 302 响应)
-
使用 return 的注意事项
该指令看似简单,但容易因位置或上下文出错:
- 只能出现在
server、location或if块中;不能在http全局块顶层直接使用 - 在
if中使用要格外小心 —— Nginx 官方不推荐在if中做复杂判断后 return,尤其避免与 proxy_pass 混用,可能引发未预期行为 - 返回自定义文本时,Nginx 默认不设置
Content-Type,建议配合add_header显式声明:return 200 "OK";<br> add_header Content-Type text/plain;
- 状态码必须是标准 HTTP 状态码(如 200、301、404、403、503),不支持自定义非标码(如 999)
典型实用示例
以下是一些真实部署中高频出现的写法:
-
全站维护页(503):
location / {<br> return 503;<br> }<br> error_page 503 @maintenance;<br> location @maintenance {<br> rewrite ^(.*)$ /503.html break;<br> } -
屏蔽特定 User-Agent(如爬虫):
if ($http_user_agent ~* "SemrushBot|AhrefsBot") {<br> return 403;<br> } -
强制 HTTPS 跳转(非 301/302 重定向,而是协议校验):
if ($scheme != "https") {<br> return 301 https://$host$request_uri;<br> }(注意:更推荐用 server 块监听 80 端口做 301)
return 和 rewrite 的关键区别
初学者易混淆两者:
-
return是立即终止并返回响应,不走后续匹配逻辑 -
rewrite ... redirect是发起一次外部重定向(302),而rewrite ... last/break是内部重写,仍继续匹配 location - 性能上,
return开销最小,适合简单控制流;rewrite更灵活但涉及 URI 解析和重新匹配


















