用 try_files + error_page 实现静态资源缺失时的自动降级,核心是内部重定向至兜底页并返回200状态码,避免白屏;支持本地降级、备用源站回源及最终静态页三级容灾。

当静态资源(如 JS、CSS、图片)缺失时,用 error_page 实现自动降级,核心是“不暴露 404,而是内部切换到兜底内容”,让前端无感知、状态码友好、体验平滑。
用 try_files + error_page 组合触发本地降级
这是最常用也最可控的方式。关键不是等 Nginx 自动返回 404 再跳转,而是主动控制流程:
- 在静态资源 location 中使用
try_files $uri =404,确保只在文件真不存在时才触发错误 - 紧接着配置
error_page 404 = @fallback,用等号表示内部重定向,不改变响应状态码 - 在
@fallback命名 location 中,通过root和index或try_files返回统一降级页(如/fallback/index.html)
让降级页返回 200 状态码提升体验
用户看到白屏或报错,往往是因为浏览器收到 404 后停止加载或报异常。把降级页设为 200 可避免这类问题:
- 写成
error_page 404 =200 /fallback/,Nginx 会以 200 状态码返回该路径 - 配合
location /fallback/ { root /usr/share/nginx/html; index index.html; },自动匹配index.html - 这样即使 JS 加载失败,页面仍能展示“资源加载异常,请刷新”之类提示,不中断 SPA 路由
结合备用源站做两级容灾
仅靠本地降级不够时,可引入后端兜底——先查本地,再回源备用服务器,最后才上静态页:
- 主 location 尝试本地文件,失败后交由
@fallback处理:try_files $uri @fallback; -
@fallback中用proxy_pass转发到备用源站(如对象存储或 CDN 回源地址) - 在
@fallback内再配一层error_page 404 = /degrade.html,确保备用源也无文件时有最终兜底 - 注意开启
proxy_intercept_errors off(默认值),否则 404 不会冒泡到error_page
避免常见失效陷阱
很多配置看似正确却不起作用,通常卡在这几个细节上:
-
error_page必须和try_files或proxy_pass在同一个 location 块内,跨块不生效 - 指向的降级路径(如
/fallback/)必须能被 Nginx 正确解析,检查root是否覆盖该路径、文件权限是否可读 - 不要混用
return 404和error_page:前者直接终止流程,后者才触发错误处理链 - 若用了
alias,注意路径拼接规则;推荐对降级页统一用root+location = /path配合alias

















