fb9ae11aa8
修复升级前端版本后,用户必须退出重新登录才能看到新版页面的问题。 根因:nginx 和 Lite 版 Go 静态服务均未设置 Cache-Control,浏览器按 启发式策略长期缓存 index.html,导致刷新仍加载旧版入口 HTML,旧版 引用的 hash 文件名也就不会变更。 改动: - frontend/nginx.conf: index.html 及 SPA fallback 设 no-cache, must-revalidate;/assets/* (Vite 产物带 hash 文件名)设一年 immutable 长缓存。location 内重复声明原有安全头,避免 nginx add_header 不继承导致安全头丢失。 - internal/router/router.go: Lite 版 serveFrontendStatic 按同样 策略设置 Cache-Control。
83 lines
3.5 KiB
Nginx Configuration File
83 lines
3.5 KiB
Nginx Configuration File
server {
|
|
listen 80;
|
|
server_name localhost;
|
|
# Default 50M, configured via MAX_FILE_SIZE_MB env var
|
|
client_max_body_size ${MAX_FILE_SIZE};
|
|
|
|
# 安全头配置
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
|
|
# 错误日志配置
|
|
error_log /var/log/nginx/error.log warn;
|
|
access_log /var/log/nginx/access.log;
|
|
|
|
# 前端静态文件
|
|
location / {
|
|
root /usr/share/nginx/html;
|
|
index index.html;
|
|
try_files $uri $uri/ /index.html;
|
|
|
|
# index.html 及 SPA fallback 不可缓存,否则前端升级后用户看不到新版本
|
|
add_header Cache-Control "no-cache, must-revalidate" always;
|
|
# nginx add_header 不从上层继承,需要在 location 内重复声明安全头
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
}
|
|
|
|
# Vite 构建产物 /assets/* 带 hash 文件名,可长期缓存
|
|
location ^~ /assets/ {
|
|
root /usr/share/nginx/html;
|
|
|
|
add_header Cache-Control "public, max-age=31536000, immutable" always;
|
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
add_header X-Content-Type-Options "nosniff" always;
|
|
add_header X-XSS-Protection "1; mode=block" always;
|
|
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
|
}
|
|
|
|
# 本地存储文件代理到后端服务(用于渲染 markdown 中的图片)
|
|
# 精确匹配 /files,避免 Nginx 自动补 / 触发 301
|
|
location = /files {
|
|
proxy_pass ${APP_SCHEME}://${APP_HOST}:${APP_PORT}/files;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
# API请求代理到后端服务
|
|
# APP_SCHEME 默认 http,远程 HTTPS 后端可设为 https
|
|
location /api/ {
|
|
proxy_pass ${APP_SCHEME}://${APP_HOST}:${APP_PORT}/api/;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
# 连接和重试配置
|
|
proxy_connect_timeout 30s; # 连接超时时间
|
|
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
|
|
proxy_next_upstream_tries 3; # 重试次数
|
|
proxy_next_upstream_timeout 30s; # 重试超时时间
|
|
|
|
# SSE 相关配置
|
|
proxy_http_version 1.1; # 使用 HTTP/1.1
|
|
proxy_set_header Connection ""; # 禁用 Connection: close,保持连接打开
|
|
chunked_transfer_encoding off; # 关闭分块传输编码
|
|
proxy_buffering off; # 关闭缓冲
|
|
proxy_cache off; # 关闭缓存
|
|
proxy_read_timeout 3600s; # 增加读取超时时间
|
|
proxy_send_timeout 3600s; # 增加发送超时时间
|
|
}
|
|
|
|
# 错误页面
|
|
error_page 500 502 503 504 /50x.html;
|
|
location = /50x.html {
|
|
root /usr/share/nginx/html;
|
|
}
|
|
} |