应使用302临时重定向,首选return 302指令实现轻量、不可缓存的跳转;需避免301、确保维护页不被直接访问、防止跳转循环,并返回正确Content-Type与可选提示头。

系统维护期间用 Nginx 做临时跳转,核心是明确告诉浏览器和搜索引擎:“这只是暂时的,原地址依然有效”。302 重定向正是为此设计的,配置关键在于不缓存、不传递权重、每次请求都走服务器验证。
直接用 return 指令最稳妥
适合简单、确定的跳转目标,比如全部请求导向一个维护页:
server {
listen 80;
server_name example.com;
location / {
# 所有请求临时跳转到维护页面
return 302 /maintenance.html;
}
location = /maintenance.html {
root /usr/share/nginx/html;
internal; # 仅限内部跳转,防止直接访问该路径
}
}-
return 302明确返回状态码,性能高、无正则开销 - 不加
$request_uri,避免把参数带过去(维护页通常不需要) -
internal确保/maintenance.html不能被用户直接输入 URL 访问
用 rewrite + redirect 实现路径级控制
适合只对部分路径做跳转,比如 /admin/ 和 /api/ 下所有请求都跳:
location /admin/ {
rewrite ^(.*)$ /maintenance.html redirect;
}
location /api/ {
rewrite ^(.*)$ /maintenance.html redirect;
}-
redirect标志等价于302,会强制浏览器地址栏变更为新地址 -
^.*$匹配任意路径,$1可捕获并复用原始路径(如需保留) - 注意别和
last或break混用——那属于内部重写,不会触发浏览器跳转
配合真实维护场景的细节建议
避免跳转循环:确保维护页本身不在跳转规则覆盖范围内(如上面用
location = /maintenance.html单独处理)返回正确 Content-Type:维护页 HTML 文件应以
text/html响应,Nginx 默认支持,无需额外设置-
加个简单提示头(可选):
add_header X-Maintenance "true" always;
方便前端或监控脚本识别当前处于维护模式
别用 permanent 或 301:哪怕只维护一小时,用了 301 就可能被浏览器或 CDN 缓存数天,恢复后用户仍被跳走
本质上,302 跳转不是“设对就行”,而是“设得足够轻量且不可缓存”。用 return 302 是首选,简洁、可控、无歧义。


















