Files
aurora-admin/nginx.conf
T
aurora-admin f1fbfc2ddb
Regression / regression (push) Canceled after 0s
feat(品牌标识): 几何 K 图标(favicon/顶栏标记/theme-color) + 并行会话成果入库
## 品牌标识(本次会话)

起因:品牌此前没有任何图形标识 —— 唯一 favicon 是内联 data-URI 里的字母「A」,
那是 v2.0.0「Aurora Admin → Kole UI」改名漏掉的一处(PC 顶栏也是「A」,
移动端站已是「K」;移动端文档站则完全没有 favicon)。

- 几何:24 网格三个互不接触的笔画(竖 + 两斜),圆头描边;
  描边 2.25 → 16px 标签页尺寸下正好 1.5px = 规范原文「描边1.5px」
- 取色分两套(刻意):favicon 硬编码品牌蓝/白(渲染在浏览器标签栏,不继承 kole-dark);
  顶栏标记走 currentColor(实测暗色下自动转 rgb(20,22,28))
- 新增 theme-color 双条(light #FFFFFF / dark #1C1F26,取 --kole-color-card-bg)
- 修 site/app.js hero 标语 KOLE ADMIN → KOLE UI(改名变形残留)
- 移动端 7 个模板补 favicon(此前计数 0)

验收:门禁 9 条全 OK(site-routing/site-routes/mobile-docs/mobile-site/isolation/
theme/nav/i18n/icons);PC 回归 1464/1464 · 移动端 807/807,各连跑 8 次一致;
两端 favicon 405 字节逐字节一致;PC 站控制台错误 1→0。

## 并行会话成果(本次一并入库)

- 图标系统:2576 图标(TDesign/Element Plus,MIT)+ 11 端注入 + 5 个构建门禁工具
  + IconPreview 预览页 + ICON-SPEC.md 冻结规格
- 移动端平台:47 组件 × 6 端 + 文档站 53 页 + 隔离门禁
- PC 组件:103 个大后台组件 / 组件11 批次
- uni-app:PC 端试点 + 移动端端实现 + 真实编译验证

## 工程

- .gitignore 补 .scratch/ 与 .zcode-preexisting-*.txt(会话中间产物,实测 9.1MB,不入库)
- CHANGELOG 补品牌标识条目
- ROADMAP 登 S8-P4(品牌标识任务包 + og:image/apple-touch-icon 未做部分)
2026-09-21 10:05:48 +08:00

112 lines
5.9 KiB
Nginx Configuration File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Keep redirects relative so a host-published port is preserved.
absolute_redirect off;
server {
listen 80;
server_name _;
# 不在响应头与默认错误页暴露 nginx 版本号
server_tokens off;
root /usr/share/nginx/html;
index index.html;
# 安全响应头与 site/dev-server.js 的 SECURITY_HEADERS 保持一致:
# 同一批页面在本地 dev-server 下用这套 CSP 已实测可用,不能再收紧
# (演示页与文档站大量依赖内联 script/style)。
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; frame-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# 文档站改得频繁:让浏览器每次带 If-None-Match 重新校验,避免出现
# 「已经部署了新 app.js,但浏览器仍跑旧版」这类"改了看不到"。
# 实测过:没有这条时浏览器会启发式缓存 app.js,重新部署后必须强刷才生效。
# 未变更时 ETag 命中返回 304,开销极小。
add_header Cache-Control "no-cache" always;
# /healthz 只设 default_type(覆盖 http 级 application/octet-stream),
# 不能用 add_header Content-Type —— 那会追加出重复的 Content-Type;
# 且 location 内任何 add_header 都会覆盖 server 级继承的安全头。
location = /healthz {
access_log off;
default_type text/plain;
return 200 'ok\n';
}
# 默认重定向到 /site/
location = / {
return 302 /site/;
}
location = /index.html {
return 302 /site/;
}
# 版本清单只留部署根一份:快照自带的那份是归档当时的快照,之后新归档的版本不会进去,
# 会让快照页误判成单版本(实测:切到旧版后回不到最新版)。所以 /<x.y.z>/versions.json
# 与 /<x.y.z>/site/versions.json 都由根那份应答,而不是回落到该版壳。
location ~ ^/[0-9]+\.[0-9]+\.[0-9]+/(?:site/)?versions\.json$ {
rewrite ^ /versions.json break;
try_files /versions.json =404;
}
# 历史版本快照的裸入口 /<x.y.z>/ 送到**该版**站点(快照由 tools/snapshot-site.mjs 产出)。
# 版本号必须捕获出来拼进 Location:2026-09-20 实测原写成 `return 302 /site/`,于是
# /1.4.1/ 与 /1.4.1/index.html 被跳到**现行版本**,归档入口进不去归档本身。
# 与 dev-server 的 verRoot 规则(/<x.y.z>/ → /<x.y.z>/site/)保持一致。
# 用 (?!versions\.json) 让清单请求落上一条,而不是被重定向成 HTML 壳。
location ~ ^/([0-9]+\.[0-9]+\.[0-9]+)/(?!versions\.json)(?:index\.html)?$ {
return 302 /$1/site/;
}
# 文档站用 History API 路由(URL 里没有 #):/site/component/button/h5 这类深层路径
# 磁盘上没有对应文件,回落到 SPA 壳 /site/index.html,由 app.js 按 pathname 渲染。
# 与 site/dev-server.js 的 isSpaRoute 行为一致。
location /site/ {
try_files $uri $uri/ /site/index.html;
}
# 历史版本快照(tools/snapshot-site.mjs 产出):/1.4.1/site/component/button/h5 回落到
# 该版自己的壳。nginx 用 PCRE,这里用 (?!site/) 排除根站点,避免与上一条的边界含糊。
# 捕获组 1 = 版本号,回落目标用 $1 拼 —— 不能用 $0(那是整段匹配)。
location ~ ^/([0-9]+\.[0-9]+\.[0-9]+)/(?!site/).+ {
try_files $uri $uri/ /site/index.html;
}
location ~ ^/([0-9]+\.[0-9]+\.[0-9]+)/site/ {
# 末位必须是 =404:快照目录不存在时(归档被清理 / 尚未归档),回落目标
# /$1/site/index.html 会**再次匹配本 location** → nginx 报
# "rewrite or internal redirection cycle while internally redirecting to
# /1.4.1/site/index.html" 并返回 **500**(2026-09-20 实测,容器日志可查)。
# 带上 =404 后,前三个参数退化为**文件存在性检查**:快照在 → 直接发它自己的壳;
# 快照不在 → 干净的 404,而不是 500。
try_files $uri $uri/ /$1/site/index.html =404;
}
# 带扩展名的静态资源缺失时返回真 404,别让回落把 index.html 当 JS/CSS 发出去
# (正则 location 优先于前缀 location;路由段的 slug 里不含点,不会误伤)。
location ~* ^/(?:[0-9]+\.[0-9]+\.[0-9]+/)?site/.+\.[a-zA-Z0-9]+$ {
try_files $uri =404;
}
# 版本清单每次构建都会重写:必须 no-store,否则版本菜单会停在旧列表上。
# 注意 location 内一旦 add_header 就不再继承 server 级安全头 —— 必须补全同一套。
location ~ ^/(?:[0-9]+\.[0-9]+\.[0-9]+/)?site/versions\.json$ {
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; frame-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Cache-Control "no-store" always;
default_type application/json;
}
location / {
try_files $uri $uri/ =404;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024;
}