GitHub Actions部署Laravel至Heroku返回Forbidden的问题排查
问题核心判定
你遇到的Forbidden You don't have permission to access this resource.报错,核心成因是Heroku托管的Web服务根目录没有指向Laravel框架要求的public/公开入口目录,而非单纯的文件权限不足、.htaccess规则错误问题。当Web服务器把项目根目录作为站点根时,根目录没有可直接作为Web入口的默认索引文件,就会直接返回403禁止访问,你之前在根目录添加的.htaccess因为不在Web加载路径上,完全不会生效。
遗漏的关键配置环节
- Procfile配置缺失正确的Web启动参数:Heroku官方PHP构建包默认会把站点根目录设为项目根路径,如果你没有在Procfile中明确指定站点根目录指向
public/,相当于直接把Laravel的核心目录、配置文件、数据库文件暴露在Web可访问路径下,服务器为了安全会直接拦截访问,返回403。 - 部署流程缺失生产环境初始化步骤:你的build阶段只做了代码检出和上传,没有在部署包中生成生产环境运行需要的
.env文件、写入有效的APP_KEY,就算路径问题解决,后续也会碰到框架初始化失败的问题。 - 冗余的根目录.htaccess反而可能引发冲突:Laravel的URL重写规则已经内置在
public/.htaccess中,你在根目录新增的.htaccess因为不在Web加载路径上完全不生效,后续调整目录时还可能和内置规则产生重写冲突。
分步修复操作
修正项目根目录的Procfile配置
直接把Procfile的内容替换为明确指向public目录的启动命令:web: vendor/bin/heroku-php-apache2 public/这里末尾的
public/参数是核心,会强制Heroku的PHP构建包把Web服务的根目录定位到项目的public子目录,所有外部请求都会从public/index.php进入框架,完全绕开项目根目录的敏感文件,非常适配你作为移动端REST API服务的安全要求。调整GitHub Actions的build部署流程
当前你的build步骤没有做部署前的必要准备,补充以下步骤后再触发部署:- 部署前复制
.env.example为生产用.env文件,自动生成有效的APP_KEY - 移除部署后手动执行
chmod -R 777 storage bootstrap/cache的步骤——Heroku的临时文件系统默认权限已经满足Laravel的运行要求,过度放开777权限反而可能触发平台的安全告警 - 提前在Secrets中配置好线上数据库、第三方API的连接参数,确保部署后框架能正确读取配置
调整后的build job参考片段:
build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Prepare production environment run: | cp .env.example .env php artisan key:generate --force - uses: akhileshns/heroku-deploy@v3.12.12 with: heroku_api_key: ${{secrets.HEROKU_API_KEY}} heroku_app_name: ${{secrets.HEROKU_APP_NAME}} heroku_email: ${{secrets.HEROKU_EMAIL}}- 部署前复制
清理冗余配置
直接删除项目根目录下你之前新增的.htaccess文件,所有URL重写、静态资源解析逻辑直接使用Laravel内置在public/.htaccess的默认规则即可,不需要额外修改。
快速排查定位路径
- 部署完成后查看Heroku的应用启动日志,确认日志中标注的站点根目录路径是
/app/public,而不是/app - 在Heroku控制台执行命令
ls -la public/,确认index.php入口文件没有被部署流程过滤丢失 - 如果调整后仍有报错,在
public/index.php的框架加载逻辑前临时输出测试字符串,验证流量是否已经正确进入public目录的入口文件
内容的提问来源于stack exchange,提问作者phemieny7
相关产品推荐
相关产品推荐

