Drupal9 OpenLiteSpeed下图片样式未生成到public目录问题
故障原因
该问题是OpenLiteSpeed与Apache重写规则逻辑差异导致的:
- OpenLiteSpeed执行重写规则时,对
REQUEST_FILENAME的文件存在性判断逻辑和Apache、Nginx不一致,会将URL携带的查询参数计入文件路径校验 - Drupal响应式图片样式请求默认携带
itok安全校验参数,当对应样式图片还未生成时,OpenLiteSpeed无法正确匹配到「文件不存在则转发给index.php处理」的规则,直接返回404错误 - 手动在路径中加入
index.php时,请求直接进入PHP路由,Drupal正常触发图片生成逻辑,文件落地到styles目录后,后续请求因为文件真实存在,就可以直接正常加载。
你当前.htaccess中针对files/styles路径的专用转发规则处于注释状态,没有生效,也是问题出现的诱因之一。
修复方案
方案1:修改.htaccess增加图片样式路径专用转发(推荐)
打开Drupal根目录下的.htaccess文件,找到被注释的styles路径重写规则,替换为如下内容,放在通用重写规则之前:
# 强制转发图片样式请求到index.php,兼容OpenLiteSpeed重写逻辑 RewriteCond %{REQUEST_URI} ^/sites/default/files/styles/ RewriteRule ^ index.php [L,QSA]
规则说明:
- 所有匹配图片样式路径的请求,直接内部转发给
index.php处理,不做文件存在性校验 QSA标记会保留原有itok参数,不影响Drupal的安全校验逻辑- 不要添加
R=301/R=302跳转标记,避免产生不必要的外部重定向
修改完成后重启OpenLiteSpeed,清空Drupal全站缓存即可测试。
方案2:调整OpenLiteSpeed虚拟主机重写配置
如果不想修改站点.htaccess文件,可以调整服务器配置对齐Apache行为:
- 登录OpenLiteSpeed管理后台,进入对应站点的虚拟主机配置页
- 找到「Rewrite」配置项,将
Check File Existence选项设置为No - 保存配置后执行平滑重启,清空Drupal缓存测试
该配置会关闭OpenLiteSpeed提前校验文件是否存在的逻辑,完全按照.htaccess定义的规则执行重写,和Apache运行行为保持一致。
方案3:临时兜底方案
如果暂时无法调整配置,可以通过Drupal后台性能页面或drush命令批量预生成所有图片样式文件,临时解决访问问题,但后续新上传的图片仍会出现相同故障,不建议作为长期方案使用。
验证方法
修复完成后可以先删除sites/default/files/styles目录下的测试文件,直接访问不带index.php的图片样式地址,如果可以正常加载图片,且对应目录自动生成了目标图片文件,说明修复生效。
内容的提问来源于stack exchange,提问作者danplaton4
相关产品推荐
相关产品推荐

