关键在于按角色分配最小权限:Web进程需读代码、写缓存上传,开发者可维护,其他人隔离;属主设deploy、属组设www-data,代码目录640只读,public/750分层控制,runtime和上传目录770+660严格隔离。

设置PHP网站目录读写权限,关键不是“全开”或“全锁”,而是按角色分配最小必要权限:Web服务器进程要能读代码、写缓存和上传文件,开发者要能维护,其他用户则应被隔离。
明确属主与属组是前提
Linux下权限生效依赖用户和组归属。典型配置是:
- 项目根目录及代码目录(app/、config/、route/等)属主设为部署用户(如
deploy),属组设为Web服务组(如www-data或nginx) - 执行:
chown -R deploy:www-data /path/to/project - 这确保你(deploy)可修改文件,Web进程(属于www-data组)可读取运行——但不能随意改配置,安全又实用
代码目录只读,禁止运行时写入
包含PHP逻辑、路由、配置的目录绝不能被Web进程写入,否则易被恶意覆盖:
- 锁定
app/、config/、route/、extend/等目录:find . -path "./app" -o -path "./config" -o -path "./route" -o -path "./extend" | xargs chmod -R 640 - 640含义:属主可读写,属组仅可读,其他用户无权访问——既满足PHP解析需求,又堵住写入后门
public目录需精细分层控制
public/是Web服务器直接暴露的入口,权限必须分对象设置:
立即学习“PHP免费学习笔记(深入)”;
-
public/目录本身:750(属主读写执行 + 属组读执行),确保Web进程能遍历 -
public/index.php:640(属主读写,属组只读)+ 必须加执行位(Apache/Nginx需+x才能调用PHP解析器) -
public/static/及其子目录:750,让Web服务能读取CSS/JS/图片,但禁止执行任意脚本
runtime与上传目录必须可写且隔离
日志、缓存、模板编译、用户上传等目录,是唯一需要Web进程写入的地方:
-
runtime/:chmod -R 770 runtime/→ 目录可进可读可写;find runtime/ -type f -exec chmod 660 {} \;→ 文件仅限属主+属组读写,防日志泄露 - 上传目录(如
public/storage): 若config/filesystem.php中定义了'root' => app()->getRootPath() . 'public/storage',则执行chmod -R 770 public/storage,并确认该路径未被Git追踪



















