documentroot必须指向项目public目录而非根目录,否则会暴露.env等敏感文件、触发403错误或导致路由失效;需配allowoverride all、require all granted,并启用mod_rewrite。

DocumentRoot 必须指向项目 public 目录,不是整个框架根目录;否则会暴露敏感文件、触发 403 错误或导致路由失效。
Apache 中 VirtualHost 配置的关键路径和权限
域名已解析到服务器 IP 后,Apache 虚拟主机配置的核心不是“加个域名”,而是确保请求真正落到 PHP 入口,并被安全处理。
常见错误现象包括:访问首页空白、CSS/JS 404、.env 文件可直接下载、index.php 被当成纯文本下载。
-
DocumentRoot必须设为框架的public目录(如/var/www/myapp/public),而非项目根目录(/var/www/myapp) -
<directory></directory>块中必须包含AllowOverride All,否则 Laravel/ThinkPHP 的.htaccess重写规则不生效 -
Require all granted是 Apache 2.4+ 的必需写法,Order allow,deny在新版中已废弃 - 确认
mod_rewrite已启用:a2enmod rewrite(Debian/Ubuntu)或检查httpd.conf中LoadModule rewrite_module未被注释
Nginx 中 server 块必须用 try_files + fastcgi_pass
Nginx 不解析 .htaccess,也不能靠 AllowOverride 控制重写,所有 PHP 路由逻辑必须显式写进配置。
如果只配了 root 和 index index.php,Laravel 的 /dashboard 这类 URL 会直接 404。
-
root指向public目录(同 Apache) - 必须有
try_files $uri $uri/ /index.php?$query_string;,否则伪静态失效 -
fastcgi_pass必须指向正确的 PHP-FPM socket 或端口,例如unix:/run/php/php8.2-fpm.sock或127.0.0.1:9000 - 确保
fastcgi_param SCRIPT_FILENAME设置为$document_root$fastcgi_script_name,否则 PHP 找不到执行文件
PHP-FPM 用户权限与 open_basedir 冲突
即使 Nginx/Apache 配置全对,仍出现 500 错误或“Permission denied”日志,大概率是 PHP-FPM 进程用户没权限读取项目文件。
典型表现:首页能打开,但上传失败、缓存写入报错、file_put_contents 抛出 warning。
- 查 PHP-FPM 运行用户:
ps aux | grep php-fpm,通常为www-data(Debian)或apache(CentOS) - 确保该用户对
public/、storage/、bootstrap/cache/等目录有读写权限(chown -R www-data:www-data /var/www/myapp) - 若启用了
open_basedir,需在php.ini或池配置(www.conf)中显式加入项目路径,例如:open_basedir = /var/www/myapp/:/tmp/ - 禁用 SELinux 临时验证(
setenforce 0),若问题消失,说明需调整上下文:chcon -R -t httpd_sys_rw_content_t /var/www/myapp/storage
本地 hosts 测试阶段容易忽略的 DNS 缓存和端口监听
你改完了配置、重启了服务、浏览器却还是跳转到旧站或显示连接拒绝——别急着重装,先看这两点。
- Windows/macOS/Linux 都会缓存 hosts 解析,改完后执行:
sudo dscacheutil -flushcache(macOS)、ipconfig /flushdns(Windows)、sudo systemd-resolve --flush-caches(systemd 系统) - 确认 Apache/Nginx 实际监听的是 80(或 443),而不是被 Skype、IIS、Docker 或其他服务占用了:
sudo ss -tulpn | grep ':80' - 检查防火墙是否放行:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS) - 用
curl -I http://your-domain.test绕过浏览器,看返回的Server和Status头是否符合预期
DocumentRoot 和 root 指向 public 目录这一步,看似简单,却是绝大多数 403/404/下载源码问题的根源。它不是“可选项”,是现代 PHP 框架部署的强制前提。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











