fix: SPA 路由回退的 HTML 补 no-cache 头(配合 #1732 白屏修复) #1735
Merged
auto-approve-bot
merged 1 commits from 2026-09-06 14:05:45 +08:00
fix/nginx-html-nocache into develop
1 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f066a8ef4e |
fix: SPA 路由回退的 HTML 补 no-cache 头,修发版后旧标签页白屏
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 30s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 32s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m13s
AI Code Review / AI Code Review (pull_request) Successful in 1m33s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 1m36s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m17s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m2s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 5m4s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 8m58s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 4s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m33s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 8s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 18s
问题排查发现两层缺陷:
1. 运行时 bind mount 的 nginx 配置是服务器旧版(无 index.html no-cache 块);
2. 即使最新仓库配置,location = /index.html 只对直接访问 /index.html 生效,
用户从 /login、/app/dashboard 等路由进入时走 location / 的 try_files 回退,
返回的 HTML 没有 no-cache 头——旧标签页会长期缓存含旧 chunk 引用的 HTML,
发版后点菜单就 Failed to fetch dynamically imported module 白屏。
修复:在 location / 块直接 add_header Cache-Control no-cache:
- try_files 回退的 SPA HTML 与 HTML 文档每次校验,发版后能拿到新 chunk 引用
- 带 hash 的静态资源由更高优先级的 location ~* \.(js|css...) 匹配,
保持 expires 1y + immutable,不受影响
5 份配置同步:infra/docker/nginx{,-staging,-production}.conf +
deploy/configs/nginx{,-staging,-production}.conf(保持一致,避免再混用)
|