codeigniter权限问题核心在于路径合法性、执行位缺失和框架机制匹配,需区分文件系统级与业务逻辑级权限,确保writable/和uploads/目录存在、属主正确、sess_save_path为fcpath绝对路径,并通过web服务器配置隔离敏感文件访问。

CodeIgniter权限问题,核心不在“给多少数字”,而在于路径合法性、执行位缺失和框架机制匹配。最稳妥的处理方式是分清两类权限:Web服务器对目录的访问控制(文件系统级),和应用逻辑对资源的访问控制(业务逻辑级)。两者不能混为一谈,也不能只靠chmod 777糊弄。
确认 writable/ 和 uploads/ 目录的真实状态
这两个目录是CI运行时写入缓存、日志、session、上传文件的关键位置,出错会直接导致功能瘫痪。 - 手动检查路径是否存在且为绝对路径:`writable/` 必须在项目根目录下,不能是软链接悬空或拼写错误(如 `writa`); - 确保父目录有执行位(x):Linux下目录需有 x 权限才能进入和遍历,`chmod 755 writable/` 比 `777` 更安全也更必要; - 所有子目录(如 `writable/sessions`、`writable/cache`)都必须由 Web 进程用户(如 `www-data` 或 `apache`)拥有:chown -R www-data:www-data /var/www/html/writable
chown -R www-data:www-data /var/www/html/uploads
session 路径必须用 FCPATH 构造绝对路径
`$config['sess_save_path']` 写相对路径(如 `'writable/sessions'`)或空值,CI 的 Session_files_driver 会在 mkdir 时直接报 `Invalid path`。这不是 PHP 报错,而是 CI 主动拦截。 - 唯一推荐写法:$config['sess_save_path'] = FCPATH . 'writable/sessions';
- 配置前先手动创建该目录并赋权,避免运行时自动创建失败; - 不要依赖 `0777`:`700` 或 `750` 配合正确属主已足够,还能防止其他系统用户越权读取 session 文件。公共目录下的敏感文件必须隔离访问
像 `/logs/`、`/uploads/private/` 这类路径,如果能被 URL 直接访问(如 `https://site.com/logs/app.log`),说明 Web 服务器未做访问限制。 - Apache:在对应 `权限控制逻辑应交由专用组件而非硬编码
用 hook 手写 ACL 容易遗漏边界、难维护;直接改控制器判断又违反关注点分离。 - 推荐使用 Ion-Auth(CI4)或官方授权扩展,它内置角色组、权限继承、数据库驱动策略; - 若需轻量控制,至少把权限规则抽离为 config 文件,配合中间件(如 CI4 的 Filters)统一拦截; - 避免在视图里用 `if($role == 'admin')` 控制按钮显示——权限校验必须发生在请求入口,而不是渲染阶段。不复杂但容易忽略











