Laravel部署AWS Elastic Beanstalk报错:无法访问根目录
让我帮你梳理一下问题根源和对应的解决步骤:
问题核心原因
你的错误日志明确指出Apache找不到/var/www/html/public/下的索引文件,同时目录索引被禁止。这是因为你把Laravel的index.php和.htaccess移到了项目根目录,但Elastic Beanstalk的配置里依然把文档根目录指向了/public,两者完全不匹配,导致Apache找不到入口文件,触发了权限错误。
分步解决方案
1. 修正文档根目录配置
打开你的.ebextensions/02-project.config,找到document_root的配置项,把它从/public改成项目根目录(也就是/),因为EB会把你的代码部署到/var/app/current,设置为/就会指向这个根目录:
- namespace: aws:elasticbeanstalk:container:php:phpini option_name: document_root value: /
2. 统一容器命令的工作目录
检查你的.ebextensions/01-main.config,部分容器命令没有指定工作目录cwd,这可能导致命令在错误的路径执行。建议给所有容器命令加上cwd: "/var/app/ondeck"(EB部署过程中临时存放代码的路径):
container_commands: 01-optimize: command: "/usr/bin/composer.phar dump-autoload --optimize" cwd: "/var/app/ondeck" 02-migrations: command: "php artisan migrate --env=production" cwd: "/var/app/ondeck" 03-cache: command: "php artisan cache:clear" cwd: "/var/app/ondeck" 04-optimize: command: "php artisan optimize --force" cwd: "/var/app/ondeck" 05-permissions: command: "chmod 777 -R /var/app/ondeck" cwd: "/var/app/ondeck"
3. 确认.htaccess规则有效性
你当前的.htaccess规则是适配根目录的index.php的,这部分不需要修改,但可以确认一下核心规则:
# Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
这条规则会把所有非文件/非目录的请求转发到根目录的index.php,完全符合你当前的文件结构。
4. 重新部署应用
把修改后的配置文件提交到代码仓库,然后重新部署到Elastic Beanstalk。新的文档根目录配置会生效,Apache就能找到根目录下的index.php,解决403权限错误。
额外建议(可选)
虽然把入口文件移到根目录是可行的,但Laravel官方推荐保留public目录作为文档根目录,这样可以避免暴露.env等敏感文件。如果之后想恢复官方结构,只需要:
- 把
index.php和.htaccess移回项目的public目录 - 将
document_root改回/public即可
内容的提问来源于stack exchange,提问作者Sirius

