Trilium Notes 103+ 版本 Nginx/OpenResty 反代兼容修复全记录(运维归档)
一、故障概述#
1.1 环境信息#
- 运行环境:1Panel + OpenResty
- 服务程序:Trilium Notes
- 升级变动:v102.x 正常 → 升级 v103+ 后分享页面异常
- 反代域名:docs.isrv.cn
1.2 升级后出现的全部故障现象#
- 分享页面侧边栏图标乱码、方框占位、字体加载失败
- 页面样式完全丢失、排版错乱、无CSS样式
- 浏览器控制台报错:静态资源 MIME 类型不匹配(application/json)
- JS/CSS 被浏览器拦截:
X\-Content\-Type\-Options: nosniff策略拦截 - 字体文件 woff2 404 加载失败
- 首页访问异常、空白/报错,短链接笔记页面可访问但无样式
1.3 浏览器核心报错日志#
- 已拦截加载自
/assets/scripts\.js的模块,MIME 类型不匹配(application/json) - 来自
/assets/styles\.css资源被阻止,MIME类型不匹配 - downloadable font: download failed boxicons.woff2 404
- NS_ERROR_CORRUPTED_CONTENT 资源损坏/内容不合法
二、故障根因深度分析(v103 版本核心变更)#
本次所有问题并非配置语法错误,而是 Trilium 103+ 对分享模块路由结构进行了重构,旧版反代规则完全失效。
2.1 关键架构变更#
Trilium 102 及更早版本:
- 分享页面静态资源、字体、CSS、JS、API 均在服务根路径
- 资源地址:
域名/assets/xxx→ 转发后端根路径即可正常访问
Trilium 103+ 新版:
- 所有分享页资源全部迁移至 /share/ 子路径下
- 前端请求:
/assets/xxx - 后端真实路径:
/share/assets/xxx
2.2 报错产生逻辑#
旧配置将 /assets/ 直接转发到 Trilium 根目录,后端根目录不存在该资源,返回 JSON格式404错误。
浏览器收到 CSS/JS 请求的返回内容是 JSON,触发:
X\-Content\-Type\-Options: nosniff严格MIME校验拦截- 静态资源全部加载失败 → 页面无样式、图标乱码
三、原旧配置存在的全部问题(102可用、103完全失效)#
3.1 原始可用旧配置#
server {
listen 443 ssl;
server_name docs.isrv.cn;
ssl_certificate /www/sites/docs.isrv.cn/ssl/fullchain.pem;
ssl_certificate_key /www/sites/docs.isrv.cn/ssl/privkey.pem;
# 首页
location = / {
proxy_pass http://127.0.0.1:10001/share/library;
proxy_http_version 1.1;
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 https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_buffering off;
}
# Share 主路径
location / {
proxy_pass http://127.0.0.1:10001/share/;
proxy_http_version 1.1;
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 https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_buffering off;
}
# 字体专用修复(移动端关键)
location ~* \.(woff|woff2|ttf|eot|otf)$ {
proxy_pass http://127.0.0.1:10001;
proxy_http_version 1.1;
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 https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443;
add_header Access-Control-Allow-Origin * always;
types {
font/woff woff;
font/woff2 woff2;
}
}
# 安全优化
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
}
3.2 旧配置致命缺陷(适配不了103+)#
- 静态资源路径不匹配
- 未单独拦截
/assets/路径,被通用规则错误转发 - 请求被转发至根路径,而非新版的
/share/assets/
- 未单独拦截
- API图片资源404
- 新版分享图片接口位于
/share/api/,旧配置无对应转发规则
- 新版分享图片接口位于
- 字体规则失效
- 新版字体路径为
/share/assets/fonts/,旧规则无法匹配
- 新版字体路径为
- 路径优先级冲突
- 正则匹配曾误拦截静态资源,导致资源返回JSON报错
- OpenResty环境兼容问题
- 部分通用Nginx配置在1Panel-OpenResty下报语法错误
四、最终修复配置(103+专用、1Panel/OpenResty稳定可用)#
该配置已100%解决:样式丢失、图标乱码、MIME报错、资源404、首页异常全部问题
server {
listen 443 ssl;
server_name docs.isrv.cn;
ssl_certificate /www/sites/docs.isrv.cn/ssl/fullchain.pem;
ssl_certificate_key /www/sites/docs.isrv.cn/ssl/privkey.pem;
charset utf-8;
# ==============================
# 103+核心修复:分享页静态资源专用路径
# 解决CSS/JS/字体MIME错误、样式丢失、图标乱码
# ==============================
location /assets/ {
proxy_pass http://127.0.0.1:10001/share/assets/;
proxy_http_version 1.1;
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 https;
proxy_buffering on;
expires 7d;
add_header Access-Control-Allow-Origin * always;
}
# ==============================
# 103+ API专用转发(修复图片、附件404)
# ==============================
location /api/ {
proxy_pass http://127.0.0.1:10001/share/api/;
proxy_http_version 1.1;
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 https;
}
# ==============================
# 独立首页规则(修复根路径无法访问)
# ==============================
location = / {
proxy_pass http://127.0.0.1:10001/share/library;
proxy_http_version 1.1;
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 https;
proxy_buffering off;
}
# ==============================
# 通用分享页面/短链接入口
# ==============================
location / {
proxy_pass http://127.0.0.1:10001/share/;
proxy_http_version 1.1;
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 https;
proxy_buffering off;
}
# ==============================
# 安全头部配置
# ==============================
add_header X-Frame-Options SAMEORIGIN always;
add_header X-Content-Type-Options nosniff always;
}
五、本次升级关键修复总结#
- 路径适配修复(核心)
- 前端
/assets/→ 后端真实/share/assets/ - 前端
/api/→ 后端真实/share/api/
- 前端
- 解决MIME类型报错
- 资源不再返回JSON404,返回正确CSS/JS/字体文件
- 浏览器不再拦截资源,样式彻底恢复
- 解决图标乱码
- 字体文件正常加载,boxicons图标恢复正常
- 修复首页访问异常
- 独立精准匹配根路径,优先转发至分享库首页
- 适配OpenResty/1Panel环境
- 去除不兼容配置、无语法报错、可直接校验重载
- 优化静态资源缓存
- 开启缓存、跨域头,提升页面加载速度与稳定性
六、最终验证标准(全部通过即修复完成)#
- ✅ Nginx配置检查无报错、重载成功
- ✅ 域名首页可正常访问分享库
- ✅ 任意分享短链接页面样式完整、无错乱
- ✅ 侧边栏图标正常显示,无方框乱码
- ✅ 浏览器控制台无MIME拦截、无JS报错
- ✅ 页面图片、静态资源全部200正常加载
七、运维避坑总结#
- Trilium 103+ 属于结构性路由更新,旧版反代规则完全不兼容,并非小问题bug
- 分享页面所有静态资源、API接口全部迁移至
/share/子路径,必须单独配置转发 - Nginx静态资源规则优先级必须高于通用规则,防止路径被错误拦截
- OpenResty环境禁止直接套用原生Nginx配置,需规避路径、语法兼容问题
nosniff安全头开启后,必须保证资源MIME完全正确,否则100%拦截样式