return 是 nginx 最轻量路由拦截指令,早触发、准匹配、零开销;可用于 https 跳转、非法域名拦截(444)、http 方法限制(405/444)、敏感路径禁止(403)、静态兜底(200)等场景。

return 指令是 Nginx 中最轻量、最高效的路由拦截手段——它不进入 location 匹配、不读请求体、不调用后端、不生成日志(除非 debug),直接在早期阶段终止请求并返回响应或断连。关键在于“早触发、准匹配、零开销”。
用 return 实现协议与域名级拦截
HTTP 自动跳转 HTTPS 时,把 return 301 放在 server 块顶部,比任何 rewrite 都快:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
这样请求一进来就重定向,跳过 root 解析、缓存检查、location 查找等全部后续流程。
用 return 拦截非法 Host 和未匹配域名
所有未命中 server_name 的 HTTPS 请求,包括扫描器乱填 SNI、IP 直连、空 Host,都应由 default_server 捕获并立即断连:
server {
listen 443 ssl default_server;
ssl_certificate /dev/null;
ssl_certificate_key /dev/null;
return 444;
}
444 不是 HTTP 状态码,而是让 Nginx 主动发 TCP RST 强制关闭连接,内存与 CPU 零占用。
用 return 限制 HTTP 方法与防御注入
只放行业务必需的方法,其余一律拒绝:
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS|PUT|PATCH)$) {
return 405;
}
if ($request_method ~ ^(TRACE|TRACK)$) {
return 444;
}
注意:这两条必须放在 server 或具体 location 内;444 用于 TRACE/TRACK,比 405 更彻底,不留响应体。
用 return 拦截敏感路径与非法 URL
对明确禁止访问的接口或资源路径,直接返回 403:
location ~ ^/(?:\.(git|env|htaccess)|config\.php|backup|logs) {
return 403;
}
location /admin/api/debug {
return 403;
}
也支持带参数的动态拦截,比如拒绝含目录遍历字符的请求:
if ($uri ~ "\.\.") {
return 403;
}
if ($request_uri ~ "(\.\.\/|\/\.\.|%2e%2e)") {
return 403;
}
用 return 实现静态兜底与降级
前端单页应用常用“文件不存在时返回 index.html”:
location / {
try_files $uri $uri/ @fallback;
}
location @fallback {
return 200 "/index.html";
}
或者更简洁地用 if + return(需确保 root 已设):
if (!-e $request_filename) {
return 200 "/index.html";
}
注意:return 200 后跟路径,表示内部重写并返回该文件内容,状态码为 200。
不复杂但容易忽略











