You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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加载路径上完全不生效,后续调整目录时还可能和内置规则产生重写冲突。
分步修复操作
  1. 修正项目根目录的Procfile配置
    直接把Procfile的内容替换为明确指向public目录的启动命令:

    web: vendor/bin/heroku-php-apache2 public/
    

    这里末尾的public/参数是核心,会强制Heroku的PHP构建包把Web服务的根目录定位到项目的public子目录,所有外部请求都会从public/index.php进入框架,完全绕开项目根目录的敏感文件,非常适配你作为移动端REST API服务的安全要求。

  2. 调整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}}
    
  3. 清理冗余配置
    直接删除项目根目录下你之前新增的.htaccess文件,所有URL重写、静态资源解析逻辑直接使用Laravel内置在public/.htaccess的默认规则即可,不需要额外修改。

快速排查定位路径
  • 部署完成后查看Heroku的应用启动日志,确认日志中标注的站点根目录路径是/app/public,而不是/app
  • 在Heroku控制台执行命令ls -la public/,确认index.php入口文件没有被部署流程过滤丢失
  • 如果调整后仍有报错,在public/index.php的框架加载逻辑前临时输出测试字符串,验证流量是否已经正确进入public目录的入口文件

内容的提问来源于stack exchange,提问作者phemieny7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 22:06:06