Magento 2 Wysiwyg图片上传时报Directory '' is not under storage root path问题
Magento 2.3.7-p2 WYSIWYG图片上传路径为空问题成因与修复方案
问题成因
- 会话读写逻辑不一致:原生
\Magento\Cms\Controller\Adminhtml\Wysiwyg\Images\Contents控制器执行时会先初始化CMS专属会话存储再写入current_path,但Upload控制器默认没有初始化步骤,部分场景下会错误读取全局空会话,返回空路径 - 会话cookie校验异常:Magento 2.3.7-p2升级了会话安全规则,对Admin会话cookie的
SameSite属性、域名匹配规则校验更严格,WYSIWYG的异步上传请求如果未正确携带Admin会话cookie,会触发新的匿名会话,读取不到之前存储的路径 - 跨域配置问题:如果后台访问域名、媒体资源上传接口域名不一致,又没有配置正确的Cookie作用域,跨域请求会导致会话cookie无法传递,触发空会话
- 第三方插件冲突:部分自定义编辑器、媒体管理插件会重写CMS会话存储逻辑,写入
current_path时使用的会话键、命名空间和原生Upload控制器读取规则不匹配,导致取值为空
修复方案
临时验证
先清空浏览器缓存、Admin会话,重新登录后测试上传,排除会话过期的偶发问题。
永久修复
- 对齐控制器初始化逻辑(推荐方案)
不要直接修改核心文件,通过自定义模块重写Upload控制器,补上和Contents控制器一致的会话初始化步骤:
首先在自定义模块的etc/di.xml中添加重写规则:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Cms\Controller\Adminhtml\Wysiwyg\Images\Upload" type="Vendor\Module\Controller\Adminhtml\Wysiwyg\Images\Upload" /> </config>
然后创建自定义控制器文件,重写execute方法:
<?php namespace Vendor\Module\Controller\Adminhtml\Wysiwyg\Images; class Upload extends \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images\Upload { public function execute() { // 补全会话初始化逻辑 $this->_initAction(); if (!$this->getStorage()->getSession()->getCurrentPath()) { $this->_saveSessionCurrentPath(); } return parent::execute(); } }
部署静态资源、清空缓存后即可生效。
- 修复Cookie配置
如果是域名/跨域导致的问题,进入后台Stores > Configuration > General > Web > Default Cookie Settings,做如下配置:
Cookie Domain填写站点根域名,前面加.,例.yourdomain.comCookie Path填写/Cookie SameSite设置为Lax
保存配置后清空Magento缓存、浏览器缓存。
- 第三方插件排查
禁用所有和CMS编辑器、媒体管理相关的第三方插件,逐一测试定位冲突插件,对齐其会话读写逻辑和原生规则即可。
内容的提问来源于stack exchange,提问作者Tobias Maile
相关产品推荐
相关产品推荐

