# 与 nginx/web.conf 保持同步;compose 挂载到 web 容器 server { listen 80; root /usr/share/nginx/html; index index.html; # 根路径下的验证文件走热加载目录 location ~ ^/([A-Za-z0-9._-]+\.(txt|html|xml))$ { alias /verify-root/$1; } # 静态资源必须真实存在,避免错误回退成 index.html 导致白屏 location ^~ /assets/ { try_files $uri =404; access_log off; expires 7d; add_header Cache-Control "public, immutable"; } # SPA 入口:勿长期缓存,否则发版后用户仍可能拿到旧 index location = /index.html { add_header Cache-Control "no-cache, no-store, must-revalidate"; expires -1; } # web/public 挂载到 /var/www/yh-public:与 dist 根目录同 URL(如 /logo.png),优先读挂载,无则回退 dist location ~ ^/([^/]+\.(?:png|jpe?g|gif|ico|svg|webp|webmanifest))$ { root /var/www/yh-public; try_files /$1 @dist_root_public; expires 7d; add_header Cache-Control "public, max-age=604800"; } location @dist_root_public { root /usr/share/nginx/html; try_files $uri =404; expires 7d; add_header Cache-Control "public, max-age=604800"; } # web/public/social/ → 关注我们二维码等(挂载 /var/www/yh-public) location ^~ /social/ { alias /var/www/yh-public/social/; expires 7d; add_header Cache-Control "public, max-age=604800"; } # 推广素材:含视频/封面等大文件,浏览器可长期缓存减轻二次访问流量 # 宿主机 ./web/promotion 挂载覆盖本路径,改素材后依赖 max-age 到期或用户强刷 location ^~ /promotion/ { try_files $uri =404; expires 7d; add_header Cache-Control "public, max-age=604800"; } location = / { try_files /index.html =404; } # Vue SPA:直接访问 /test 等路径须落到 index.html,否则会 nginx 404 location / { try_files $uri $uri/ /index.html; } }