本文使用 AList 的
$eb_url与 kkFileView 的/onlinePreview入口配置在线预览。部署版本需核对安全公告;上游 v5.0.2 修复了预览相关 XSS 与删除接口问题,不能仅凭浮动latest标签判断安全性。示例尚需在实际 AList 与文件转换环境中验证。
kkFileView 会由服务器下载文件,再按文件类型转换或展示;它能补充 AList 的预览能力,但不能保证每一种后缀、字体、密码文档和大文件都正常。先用一份无敏感内容的小文件验证完整链路。kkFileView 仓库
一、先选镜像和允许的文件来源
从 v5.0.2 发布说明及后续安全公告选择修复过的版本,再核对镜像仓库实际存在的 tag、架构和 digest。应用发布版本不自动等于同名 Docker tag;若没有对应可信镜像,按发布源码构建,不杜撰一个 tag。
确认镜像后,在当前终端设置 KKFILEVIEW_IMAGE 为已验证的完整镜像引用,保存为 compose.yaml:
services:
kkfileview:
image: ${KKFILEVIEW_IMAGE:?请设置已核实的镜像tag或digest}
restart: unless-stopped
ports:
- "127.0.0.1:8012:8012"
environment:
KK_BASE_URL: https://preview.example.com/
KK_TRUST_HOST: files.example.com
把 preview.example.com 换成预览服务域名,files.example.com 换成实际文件下载域名。若文件链接重定向到对象存储,还要核对最终下载主机和所选版本的重定向限制;只添加需要的来源。上游支持 KK_TRUST_HOST 与 KK_NOT_TRUST_HOST,不要直接将允许列表设为 *。必要时通过网络出口限制阻止预览服务器访问不需要的内部服务。安全配置说明、当前应用配置
docker compose config
docker compose up -d
docker compose logs --tail 100 kkfileview
配置校验成功只说明 Compose 能解析,不代表镜像拉取、文件下载和文档转换已成功。核对所选版本中的上传、删除、缓存清理等功能;预览转换产生的文件可能包含源文档内容,应按实际镜像的数据目录设计持久化和清理,不随意复制其他版本的挂载路径。
二、通过 HTTPS 反向代理
在已配置证书的 Nginx 虚拟主机中使用:
location / {
proxy_pass http://127.0.0.1:8012;
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;
}
KK_BASE_URL 要与浏览器实际访问的外部地址一致。AList 页面为 HTTPS 时,预览也应为 HTTPS,避免混合内容拦截。iframe 是否允许嵌入还受预览响应的 CSP frame-ancestors、X-Frame-Options 以及 AList 自身策略约束;不要为了排障把所有响应头一律删除,应只允许自己的 AList 来源。
三、正确编码文件 URL
预览入口接收先 Base64、再 URL 编码的文件地址。Base64 中的 +、/、= 直接放入查询字符串可能被误解析,尤其原文件 URL 自身还有签名、空格、& 参数时。
AList 的变量包括 $url、$e_url、$b_url 和 $eb_url,其中 $eb_url 对应 encodeURIComponent(btoa($url))。AList 对这些变量的说明
在 AList 管理页的 iframe 预览配置加入:
{
"doc,docx,xls,xlsx,ppt,pptx,pdf": {
"FileView": "https://preview.example.com/onlinePreview?url=$eb_url"
}
}
PDF 和 EPUB 预览同样需要使用实际支持的入口;/onlinePreviewEncoded 不对应当前上游控制器,不能靠更换路径解决 URL 编码问题。文件格式是否支持应另外核查,不能把所有格式都加到同一个列表就认为支持。预览控制器源码
四、下载权限与隐私边界
文件 URL 必须能从 kkFileView 容器访问。你在浏览器里已经登录 AList,不表示服务器下载时会自动携带这份 Cookie;URL 中的 localhost 对容器也不是用户电脑。优先用允许服务器读取的下载地址,必要时用短时效签名链接,并确认签名有效期覆盖下载与转换。
Base64 是编码,不是加密。URL 可能出现在浏览器历史、代理日志和预览缓存中;不要把长效令牌、账户密码或不该公开的文件访问凭据放进去。排障顺序是:浏览器能否访问预览服务、容器能否下载同一 URL、签名或鉴权是否有效、转换是否成功,最后再检查 iframe 与编码。
评论区