• 日期:2026-08-29
  • 项目:easyimage(部署目录:codex-docker/easyimage)
  • 涉及组件:ddsderek/easyimage 容器 + Nginx Proxy Manager 2.15.1(反向代理 img.inanaqi.top)
  • 状态:已定位根因,待执行修复(需在 NPM 后台操作)

现象

访问以下地址返回 403 Forbidden:

https://img.inanaqi.top/app/info.php?img=/i/2026/08/29/lstsoy.jpg

同时图库列表页 /app/list.php 中的缩略图请求 /app/thumb.php?img=/i/... 也全部 403(浏览器里表现为缩略图加载失败)。

排查过程

  1. 容器直连(http://127.0.0.1:8088/app/info.php?img=/i/...)返回 200,确认 EasyImage 本身正常。
  2. 公网请求响应头为 Server: openresty,确认 403 来自 NPM 反向代理层,而非应用。
  3. 对比测试:

    查询串结果
    img=/i/2026/08/29/lstsoy.jpg403
    img=i/2026/08/29/lstsoy.jpg(去前导斜杠)200
    img=/a/b403
    img=/ab/cd.jpg200

    结论:首段为单字母的路径(如 /i/...)会被拦截。

  4. 定位到 NPM 内置规则:该 proxy host 开启了 Block Common Exploits,其"文件注入"检查如下(/etc/nginx/conf.d/include/block-exploits.conf):
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
    set $block_file_injections 1;
}
if ($block_file_injections = 1) {
    return 403;
}

该规则会拦截 参数=/单字母路径/... 形式的查询串,EasyImage 上传目录路径 /i/YYYY/MM/DD/... 首段恰好是单字母 i,触发误拦。请求在 NPM 层直接 403,未到达 EasyImage。

修复方案

方案 A(推荐,最干净):NPM 后台(http://<服务器IP>:81)→ Hosts → Proxy Hosts → 编辑 img.inanaqi.topAdvanced 标签页 → 取消勾选 Block Common Exploits → 保存。NPM 会立即重新生成配置,无需重启容器。

方案 B(保留其余防护):在同一个 Advanced 页面的 Custom Nginx Configuration 中添加一行,只关闭"文件注入"检查(SQL 注入、垃圾评论、恶意 UA 等拦截仍生效):

set $block_file_injections 0;

原理:NPM 的自定义配置会加载在拦截规则之后,把变量归零后 return 403 不再触发。

验证方法

修复后执行,应返回 200:

curl -sS -o /dev/null -w '%{http_code}\n' 'https://img.inanaqi.top/app/info.php?img=/i/2026/08/29/lstsoy.jpg'

同时检查图库页缩略图是否恢复:https://img.inanaqi.top/app/list.php

标签: 故障排查, Nginx Proxy Manager, 403 Forbidden, 反向代理

添加新评论