AWS EC2上Laravel除根路由外均返回404的解决方案咨询
解决AWS EC2上Laravel非根路由404及rewrite模块启用问题
看起来你遇到了Laravel部署后的典型路由问题,还碰到了Apache模块命令的小坑——毕竟AWS EC2默认用的是CentOS/RHEL体系的httpd服务,和Ubuntu的a2enmod那套命令不兼容,咱们一步步来搞定:
1. 先搞定rewrite模块的启用问题
a2enmod是Debian/Ubuntu系Apache的模块管理命令,在CentOS/RHEL的httpd里根本不存在,得用下面的方式启用rewrite:
- 先检查rewrite模块是否已经加载:
如果输出包含httpd -M | grep rewriterewrite_module (shared),说明模块已经加载,直接跳过下一步;如果没输出,继续下面的操作。 - 编辑模块配置文件,启用rewrite:
找到这行注释掉的代码:sudo vi /etc/httpd/conf.modules.d/00-base.conf
把前面的#LoadModule rewrite_module modules/mod_rewrite.so#删掉,保存退出。 - 重启httpd服务让配置生效:
sudo systemctl restart httpd
2. 配置Apache允许.htaccess覆盖规则
Laravel的路由依赖public目录下的.htaccess文件,必须让Apache允许该目录使用AllowOverride:
- 打开httpd主配置文件:
sudo vi /etc/httpd/conf/httpd.conf - 找到对应项目public目录的
<Directory>配置块(比如你的Laravel项目放在/var/www/html/laravel/public),修改成下面的内容:
注意:一定要确保路径和你的实际项目路径一致,<Directory "/var/www/html/laravel/public"> AllowOverride All Require all granted </Directory>AllowOverride必须设为All(默认可能是None)。
3. 检查Laravel的.htaccess文件
部署新版本时很容易不小心覆盖或漏掉这个文件,确认public目录下存在.htaccess,且内容为Laravel默认的规则:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
如果文件不存在,直接从Laravel项目的默认模板中复制一份到public目录即可。
4. 修复文件权限问题(容易忽略的点)
确保httpd进程有足够权限读取项目文件:
sudo chown -R apache:apache /var/www/html/laravel sudo chmod -R 755 /var/www/html/laravel/storage sudo chmod -R 755 /var/www/html/laravel/bootstrap/cache
5. 验证与排查
完成上面的步骤后,重启httpd服务,再次访问非根路由(比如/dashboard),如果还是404,可以查看Apache的错误日志找具体原因:
sudo tail -f /var/log/httpd/error_log
日志里会明确提示是配置错误、权限问题还是文件缺失,跟着提示调整即可。
内容的提问来源于stack exchange,提问作者PHP User
相关产品推荐
相关产品推荐

