Hostinger共享主机下通过Git部署Laravel 8应用的目录结构适配问题
Hostinger共享主机Git部署Laravel 8问题解答
1. 拆分核心目录与public目录的原因
本质是安全规范和共享主机配置约束共同决定的,和Laravel版本没有直接关系:
- 安全层面:Laravel的核心目录(含
.env配置文件、app业务代码、vendor依赖等)存储大量敏感信息,若直接放置在Web可访问的public_html目录下,外部用户可直接遍历下载这些文件,导致数据库密码、应用密钥等核心信息泄露。旧版本Laravel从未允许将完整项目直接放在Web根目录,只是早年很多用户不了解安全规范,强行将完整项目部署到public_html,属于不符合官方要求的野路子操作。 - 主机配置层面:Hostinger这类共享主机默认将站点的Web根目录绑定到
public_html,普通用户无法直接修改根目录指向到项目内的public文件夹。因此只能将public目录下的入口文件、静态资源放到public_html,核心代码放到和public_html同级的非Web可访问目录,既符合Laravel的设计逻辑,又适配共享主机的默认配置。 - 入口规范层面:Laravel的唯一外部入口是
public/index.php,将public内容放到public_html后,访问域名会直接命中该入口文件,不会暴露项目的其他目录结构。
2. 仓库结构与部署结构不一致的解决方案
共有两种可落地的方案,可根据项目更新频率选择:
方案1:服务器端手动调整(适合迭代频率低的小型项目)
- 登录Hostinger的SSH终端,进入账户根目录(和
public_html同级的目录,通常为/home/你的账户名/),执行git clone 你的GitHub仓库地址 laravel_app,将完整项目拉取到外部不可访问的laravel_app目录。 - 执行命令移动
public目录内容到public_html:mv ~/laravel_app/public/* ~/public_html/ mv ~/laravel_app/public/.htaccess ~/public_html/ - 编辑
public_html下的index.php,修改两处路径引用:
将require __DIR__.'/../vendor/autoload.php';修改为require __DIR__.'/../laravel_app/vendor/autoload.php';
将$app = require_once __DIR__.'/../bootstrap/app.php';修改为$app = require_once __DIR__.'/../laravel_app/bootstrap/app.php'; - 后续更新代码时,只需进入
laravel_app目录执行git pull即可,若public目录内容有变更,再重新执行一次移动命令即可。
方案2:脚本自动部署(适合迭代频率高的项目)
在laravel_app目录下新建部署脚本deploy.sh,内容如下:
#!/bin/bash cd ~/laravel_app # 拉取最新代码 git pull origin main # 安装生产环境依赖 composer install --optimize-autoloader --no-dev # 缓存配置提升性能 php artisan config:cache php artisan route:cache php artisan view:cache # 同步public目录内容到public_html cp -rf ~/laravel_app/public/* ~/public_html/ cp -f ~/laravel_app/public/.htaccess ~/public_html/ # 给存储目录设置正确权限 chmod -R 755 ~/laravel_app/storage chmod -R 755 ~/laravel_app/bootstrap/cache
后续需要部署时,直接执行bash ~/laravel_app/deploy.sh即可完成全流程操作,无需手动调整文件。
部署完成后需校验
.env文件内的APP_URL、数据库连接、邮箱服务等生产环境配置,避免出现业务异常。
内容的提问来源于stack exchange,提问作者Dejan
相关产品推荐
相关产品推荐

