Discuz!X3.5论坛版块对手机版默认开启了图片列表模式,在版块有大量图片时,使用手机访问版块将会加载大量缩略图,缩略图的路径示例:/forum.php?mod=image&aid=20436&size=550×350&key=66823191f185c0d6。由于是动态路径,在高并发情况下将会对服务器造成明显压力。

博主使用阿里云ESA对论坛进行了加速,对该路径设置了缓存规则后仍未生效,工单反馈后得到答复:因源站返回set-cookie响应头,ESA不缓存302响应;需确保源站不返回set-cookie才能应用ESA缓存规则。按理说规则权重应当大于默认策略,但工单都明确这么说了又能如何?不如就自行解决吧,编辑文件:/source/function/function_core.php ,找到dsetcookie函数添加以下代码:
if (isset($_GET['mod']) && $_GET['mod'] == 'image') {
return;
}
以上解决了不被缓存的问题,但经博主观察,ESA对该缓存保留的时间极短(在30分钟内访问7次,5次MISS,2次HIT),已经提了工单反馈还未得到答复,不如先自行解决。
在ESA和论坛服务器之间有nginx进行反代,原有反代location不需要改动,新增一个location,配置代码如下:
location ^~ /forum.php {
# 仅当 mod=image 时才启用缓存
set $skip_cache 1;
if ($arg_mod = "image") {
set $skip_cache 0;
}
proxy_pass https://172.17.84.142:443;
proxy_http_version 1.1;
proxy_ssl_server_name on;
proxy_ssl_name www.jiangdefu.com;
proxy_set_header Host www.jiangdefu.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Accept-Encoding "";
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
proxy_cache cache_one;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 302 199d;
# 忽略上游传来的 Set-Cookie 和缓存头
proxy_ignore_headers Set-Cookie Cache-Control Expires;
# 删掉上游传来的 Set-Cookie
proxy_hide_header Set-Cookie;
# 删掉上游传来的缓存头
proxy_hide_header Cache-Control;
proxy_hide_header Expires;
# 自定义缓存状态响应头,主要在多层缓存中便于定位链路排查
add_header X-Cache-Status "$upstream_cache_status from Yoer-2";
# 重写缓存头
add_header Cache-Control "max-age=17193600, public";
# 删掉上游传过来的 Vary 头
proxy_hide_header Vary;
}
根据实际情况修改反代地址和域名,其中199d代表缓存有效期为199天,由于博主使用了多层反代,为了在F12观察缓存情况增加了自定义响应头X-Cache-Status,其中from Yoer-2指缓存状态来自Yoer-2这台服务器,也可根据实际情况修改或删除。
最终效果如图:

2026年7月20日更新:
发现缩略图失效了,查看该目录发现有刚清空迹象,原来是名为 “每日数据清理”(对应脚本:source/include/cron/cron_clean_up_daily.php)的计划任务清理的,执行缩略图清理的代码如下:
removedir($_G['setting']['attachdir'].'image', TRUE);
@touch($_G['setting']['attachdir'].'image/index.htm');
因此不可再采用以上缓存策略,否则会导致缩略图出现404的情况。