核心是将Web服务器根目录严格指向public子目录,禁止直接访问.env、app/、config/等敏感文件;需同步关闭open_basedir限制、阻止.env访问、配置安全响应头并设置合理文件权限。

核心是让 Web 服务器只公开 public/ 目录,其余所有文件(尤其是 .env、app/、config/、vendor/ 等)必须完全不可通过 URL 访问。
把网站根目录严格指向 public 子目录
这是最基础也最关键的一步。不能将 Web 根目录设为 Laravel 项目根(即含 app/、routes/ 的那层),否则攻击者可直接请求 http://yoursite.com/.env 或 /config/database.php 泄露敏感信息。
- 宝塔面板:进入「网站 → 你的站点 → 根目录」,把路径从
/www/wwwroot/your-site改为/www/wwwroot/your-site/public,保存后重启服务 - Apache 虚拟主机:在
<VirtualHost>中设置DocumentRoot /path/to/your-site/public - Nginx:在
server块中确认root指向/path/to/your-site/public,且index index.php已配置
阻止 .env 文件被直接访问
即使根目录已正确设置,仍需额外防护,防止因配置疏漏或旧缓存导致泄露。
- Apache 用户:在 Laravel 项目根目录(与
.env同级)新建.htaccess,内容为:<Files ".env"><br> Order Allow,Deny<br> Deny from all<br></Files>
- Nginx 用户:在
server块内添加:location ~ /\.env {<br> deny all;<br>} - 验证是否生效:浏览器访问
http://yoursite.com/.env,应返回 403 或 404,而非明文内容
关闭 open_basedir 限制并清理继承规则
尤其在宝塔等面板环境下,「防跨站攻击」功能默认开启 open_basedir,会限制 PHP 只能读取子目录,而 Laravel 需要上层的 vendor/ 和同级的 storage/,强行限制会导致类找不到或写入失败。
- 关闭宝塔「防跨站攻击」开关,并清空 PHP 设置中
open_basedir的值(留空) - 检查项目根目录和
public/下是否有残留的.user.ini,如有,确保public/内的.user.ini包含完整路径,例如:open_basedir=/www/wwwroot/your-site/:/tmp/:/proc/:/dev/ - 修改后重载 PHP:执行
kill -USR2 $(cat /www/server/php/80/var/run/php-fpm.pid)(路径按实际 PHP 版本调整)
补充基础 Web 层安全头与权限控制
防御不只靠路径隔离,还需配合响应头和系统权限加固。
- Nginx 配置中加入:
server_tokens off;<br>add_header X-Frame-Options "SAMEORIGIN";<br>add_header X-Content-Type-Options "nosniff";<br>add_header X-XSS-Protection "1; mode=block";
- 设置文件权限(以 nginx 用户为例):
find /path/to/your-site -type f -exec chmod 644 {} \;<br>find /path/to/your-site -type d -exec chmod 755 {} \;<br>chmod -R 775 storage/ bootstrap/cache/ - 确保
storage/和bootstrap/cache/不在 Web 可访问路径下(它们应在public/外,且已由上一步权限控制)


















