Windows 10 IIS+AD环境下Laravel文件缓存权限丢失问题
问题现象
在Windows 10搭配IIS与Active Directory的环境中使用Laravel文件驱动缓存时,偶发单个缓存文件权限丢失问题:父文件夹权限配置正常,仅特定缓存文件出现权限异常,重启设备后权限恢复,可手动删除对应文件。
报错信息
file_put_contents(C:\inetpub\wwwroot\office_map_dev\storage\framework/cache/data/ca/0d/ca0d727b27eefcb8763203d9ad28f5a5eb29a85e): Failed to open stream: Permission denied
根因定位
- AD组策略与NTFS权限继承冲突:Active Directory后台同步组策略时,会短暂中断新文件的父目录权限继承,该时间段内生成的缓存文件仅保留创建者的访问权限,不会继承父目录给IIS运行账号的读写权限
- IIS应用池身份令牌失效:默认使用
ApplicationPoolIdentity作为应用池运行身份时,该动态生成的虚拟账号身份令牌偶发过期,此时生成的缓存文件会被标记为未知创建者,NTFS自动限制访问权限 - 并发写入锁异常:Windows NTFS文件系统的独占锁逻辑和Laravel文件缓存的写入锁适配存在兼容问题,高并发下同一缓存键多次写入时会生成无有效权限的半残缓存文件
修复方案
- 配置Laravel强制设置文件权限:编辑
config/filesystems.php,给存储磁盘配置添加固定权限参数,确保所有新生成的文件权限符合访问要求:
'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'permissions' => [ 'file' => 0664, 'dir' => 0775, ], ], // 若缓存使用独立磁盘配置,同步修改对应配置项 ]
- 固定IIS应用池运行身份:打开IIS管理器→对应站点的应用池→高级设置→进程模型→标识,将默认的
ApplicationPoolIdentity改为权限固定的本地管理员账号或指定域账号,同时给该账号单独授予storage目录的完全控制权限 - 关闭目录的权限继承:右键点击
storage目录→属性→安全→高级→禁用继承,选择「将继承的权限转换为此对象的显式权限」,删除所有AD同步的多余权限项,仅保留系统、管理员、IIS运行账号的完全控制权限,勾选「替换所有子对象的权限项」后应用配置 - 异常重试兼容方案:在
app/Exceptions/Handler.php的register方法中添加权限异常捕获逻辑,匹配到缓存文件写入失败时自动删除异常文件并重试写入
内容的提问来源于stack exchange,提问作者kubexus
相关产品推荐
相关产品推荐

