codeigniter的writable/权限配置关键在路径合法、属主正确、执行位(x)到位;必须用fcpath拼接绝对路径且父目录预先存在,mkdir权限须用八进制0777或先mkdir再chmod,缺x权限将导致写入失败,ci4需确保documentroot指向public/且.env在项目根。

CodeIgniter 的 writable/ 文件夹权限配置,关键不在“给多少数字”,而在于路径合法、属主正确、执行位(x)到位。配错会导致 session 失败、缓存写入报错、日志无法生成等——多数时候根本没走到“权限拒绝”那步,而是路径创建就失败了。
writable 路径必须是绝对路径且父目录存在
CI 不接受相对路径或空值作为写入目标。尤其是 session 保存路径:$config['sess_save_path'] 必须用 FCPATH 拼接,例如:
$config['sess_save_path'] = FCPATH . 'writable/sessions';$config['log_path'] = FCPATH . 'writable/logs/';$config['cache_path'] = FCPATH . 'writable/cache/';
确认 FCPATH . 'writable/' 这个目录本身已存在(不是靠 CI 自动创建),否则 mkdir() 直接抛 Invalid path 错误。
权限数值要写对:0777 是八进制,不是字符串
PHP 的 mkdir() 函数接收的是整数权限,若传字符串 '777',会被当作十进制 777 解析,最终实际权限是 0755(因只取低三位)。正确写法只有两种:
- 用八进制字面量:
mkdir($path, 0777);(注意开头的 0) - 更稳妥:先创建再赋权:
mkdir($path, 0755); chmod($path, 0777);
生产环境不建议硬上 0777;优先改属主:chown -R www-data:www-data /var/www/html/writable,再设为 0750 或 0755。
缺执行位(x)= 不能写,哪怕权限数字看着很满
Linux 下,对目录没有 x 权限,就等于禁止进入,fopen()、move_uploaded_file() 全部失败,报错类似 “A problem was encountered while attempting to move the uploaded file”。检查命令:
-
ls -ld /var/www/html/writable—— 看输出中组和其他权限段是否有x(如drwxr-xr-xOK,drw-r--r--不行) - 补执行位只需:
chmod +x /var/www/html/writable
不需要重设整个权限,只加 x 最安全、最精准。
CI4 特别注意:WRITEPATH 生效的前提是 public/ 入口正确
CI4 默认使用 public/ 作为 Web 根目录。如果 DocumentRoot 仍指向项目根(含 application/),WRITEPATH 就会失效——因为 writable/ 不在 Web 可访问路径下,但框架又尝试从错误位置读取。务必确保:
- Web 服务器的 root 指向
/var/www/myapp/public -
.env文件放在项目根目录(与public/同级),且WRITEPATH未被手动覆盖 - CI4 的
writable/默认就在项目根下,和public/平级,无需挪动











