
在云服务器上部署 Laravel 时,将 public 目录内容(如 index.php、静态资源)置于 public_html 下,而将应用核心代码(app/、bootstrap/、vendor/ 等)移至其上级目录是安全且推荐的实践,无需强行将整个 public 文件夹也移出 Web 可访问路径。
在云服务器上部署 laravel 时,将 `public` 目录内容(如 `index.php`、静态资源)置于 `public_html` 下,而将应用核心代码(`app/`、`bootstrap/`、`vendor/` 等)移至其上级目录是安全且推荐的实践,无需强行将整个 `public` 文件夹也移出 web 可访问路径。
Laravel 的安全模型依赖于仅公开 public/ 目录下的文件,其余所有应用逻辑、配置、环境变量、迁移文件等必须严格禁止 Web 直接访问。因此,正确的部署结构应确保:
✅ public_html/(或等效 Web 根目录)仅包含原 public/ 中的入口与静态资产;
✅ 所有敏感目录(app/、config/、database/、.env、bootstrap/、vendor/ 等)位于 public_html/ 之外,无法通过 URL 访问。
以下是一种经生产验证的典型结构(以 public_html 为 Web 根):
/home/youruser/
├── public_html/ ← Web 服务器 DocumentRoot
│ ├── index.php ← 修改后的入口文件
│ ├── css/
│ ├── js/
│ └── images/
└── laravel-app/ ← 完整 Laravel 应用(不含 public/)
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── vendor/
├── .env
└── ...关键在于重写 public_html/index.php,使其正确加载外部应用:
<?php
// public_html/index.php
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;
// 指向外部 vendor 自动加载器(注意路径层级)
require __DIR__.'/../laravel-app/vendor/autoload.php';
// 指向外部 bootstrap/app.php
$app = require_once __DIR__.'/../laravel-app/bootstrap/app.php';
$kernel = $app->make(Kernel::class);
$response = $kernel->handle(
$request = Request::capture()
);
$response->send();
$kernel->terminate($request, $response);⚠️ 注意事项:
- 路径准确性至关重要:__DIR__.'/../laravel-app/...' 中的 .. 层数需严格匹配实际目录层级(例如若 laravel-app 与 public_html 同级,则用 ../laravel-app;若在更上层,需相应调整)。
- 权限隔离:确保 laravel-app/ 目录对 Web 服务器用户(如 www-data 或 nobody)不可读写执行(推荐 750 或 755,属主为部署用户),同时禁止 .htaccess 或 Nginx 配置意外暴露敏感路径。
- 静态资源更新需同步:public/ 中的 css/、js/、mix-manifest.json 等由 npm run build 或 php artisan mix 生成,需在构建后自动复制至 public_html/。可借助 Git Hooks(如 post-merge)或 CI/CD 脚本实现自动化:
# 示例:部署脚本片段(deploy.sh) cp -r ./laravel-app/public/* ./public_html/ php ./laravel-app/artisan view:clear php ./laravel-app/artisan cache:clear
- 环境文件保护:确认 .env 位于 laravel-app/.env(即 public_html/ 外),并通过 APP_KEY 和 APP_DEBUG=false 进一步加固。可通过 php -r "echo file_exists('../laravel-app/.env') ? 'OK' : 'MISSING';" 快速验证。
总结:该方案完全符合 Laravel 安全最佳实践——它不降低安全性,反而通过物理隔离强化了敏感数据防护;同时规避了复杂 Web 服务器重配置(如修改 Apache DocumentRoot 或 Nginx root),特别适合受限环境(如 cPanel 云主机)。只要确保入口文件路径正确、目录权限合理、静态资源同步及时,即可稳定、安全运行。










