使用Bref配置serverless.yml部署Laravel到AWS报500与跨域错误
问题根因说明
你遇到的页面黑屏、接口返回{"message":"Internal Server Error"}、控制台提示strict-origin-when-cross-origin三个现象里,核心故障是Lambda环境下Laravel运行异常触发500错误,CORS跨域提示是次生问题:API Gateway返回默认500响应时不会携带跨域头,才会被浏览器的跨域策略拦截,不需要先调整前端跨域配置,优先修复Lambda侧的运行错误即可。
现有serverless.yml配置的核心问题
- 部署包排除规则错误:配置了
!storage/**将整个Laravel storage目录排除在部署包外,Laravel启动必须依赖storage下的框架缓存、视图、日志目录,缺失该目录会直接导致启动失败抛500。 - 缺少Serverless环境适配的环境变量:没有配置Lambda无持久化场景下必须的缓存、Session、日志驱动参数,Laravel默认的本地存储驱动在Lambda只读环境下无法正常写入。
- httpApi事件未配置CORS规则:即使后端正常运行,跨域请求也会被浏览器拦截。
- 未配置静态资源处理规则:默认配置下API Gateway会把所有请求(包括css、js等静态资源请求)都转给PHP处理,静态资源加载失败会直接导致页面黑屏。
修复方案
1. 修正部署包排除规则
删除原有package配置里的- '!storage/**'规则,替换为仅排除本地运行产生的临时文件,保留storage目录的基础结构:
package: patterns: - '!node_modules/**' - '!public/storage' - '!resources/assets/**' - '!storage/logs/**' - '!storage/framework/cache/**' - '!storage/framework/sessions/**' - '!storage/framework/views/**' - '!tests/**'
2. 补充环境变量与CORS配置
在provider段添加Lambda运行必要的环境变量,同时开启httpApi的CORS支持:
provider: name: aws region: eu-central-1 stage: dev runtime: provided.al2 environment: APP_BASE_PATH: '/var/task' CACHE_DRIVER: array SESSION_DRIVER: cookie LOG_CHANNEL: stderr APP_ENV: production # 调试阶段可临时设为true查看具体Laravel报错,正式部署改回false APP_DEBUG: false httpApi: cors: allowedOrigins: # 正式环境替换为实际前端域名,不要长期用*通配 - '*' allowedMethods: - GET - POST - PUT - DELETE - PATCH - OPTIONS allowedHeaders: - '*' allowCredentials: false
3. 部署前执行Laravel优化命令
在本地项目根目录执行以下命令生成兼容Serverless环境的缓存文件,避免路径解析错误:
php artisan config:cache php artisan route:cache php artisan view:cache
可选优化
你当前使用的php-80层对应PHP 8.0版本已经停止维护,建议替换为${bref:layer.php-82-fpm}、${bref:layer.php-82}的PHP8.2版本层,获得更好的兼容性与安全性。
如果按以上步骤调整后仍然返回500,可以临时将APP_DEBUG设为true重新部署,再次请求接口即可看到具体的Laravel报错信息,常见剩余问题包括PHP扩展缺失、目录权限不足、.env配置参数错误。
内容的提问来源于stack exchange,提问作者jhon
相关产品推荐
相关产品推荐

