Ubuntu上排查与修复Laravel路由问题的实用步骤
一、先快速定位问题类型
- 访问任意非根路径(如 /test)时,若看到的是 Apache/Nginx 的 404 页面而非 Laravel 的友好提示,通常是URL重写未生效(Web 服务器未把请求转发给 public/index.php)。
- 若页面显示 404 或 Method Not Allowed,但在本地开发环境正常,可能是路由缓存或路由定义/顺序问题。
- 若只有新增或深层嵌套路由异常,优先检查路由定义顺序与参数约束。
二、使用 Apache 时的正确配置
- 启用重写模块并重启服务:
- 启用模块:sudo a2enmod rewrite
- 重启服务:sudo service apache2 restart(或 sudo systemctl restart apache2)
- 确保项目目录的 AllowOverride 为 All,以让 public/.htaccess 生效:
- 编辑虚拟主机配置(如 /etc/apache2/sites-available/000-default.conf 或自定义 vhost),在对应 中设置:
- AllowOverride All
- 同时确保 DocumentRoot 指向项目的 public 目录,并配置访问权限(如 Require all granted)。
- 示例 VirtualHost 片段:
- DocumentRoot /var/www/your-project/public
- <Directory /var/www/your-project/public>
- AllowOverride All
- Require all granted
- 完成后重启 Apache 并测试。以上步骤能解决“除根路径外全部 404”的常见成因(.htaccess 未生效)。
三、使用 Nginx 时的正确配置
- 将站点根目录指向 public,并使用 try_files 将所有请求转发给 index.php:
- 示例 server 配置:
- root /path/to/your-project/public;
- index index.php;
- location / { try_files $uri $uri/ /index.php?$query_string; }
- location ~ .php$ {
- fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;(按实际 PHP 版本调整)
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
- include fastcgi_params;
- }
- 启用站点并重启 Nginx:
- 软链:sudo ln -s /etc/nginx/sites-available/your-project /etc/nginx/sites-enabled
- 语法检查:sudo nginx -t
- 重启:sudo systemctl restart nginx
- 上述配置是 Laravel 在 Nginx 上的通行做法,能确保除静态文件外所有请求由 index.php 处理。
四、Laravel 应用内的常见修复
- 清除路由缓存(部署或新增/修改路由后尤需):
- 开发环境:php artisan route:clear
- 生产环境如需缓存:php artisan route:cache(变更路由后需重新缓存)
- 检查路由定义与顺序:
- 路由按定义顺序匹配,参数多或更复杂的路由应放在前面,避免被更“短”的路由提前匹配。
- 使用 php artisan route:list 核对当前生效的路由、方法与名称。
- 核对中间件与参数约束:
- 确认路由使用的中间件已正确注册;
- 对参数使用正则或类型约束,避免错误匹配或 404。
- 这些步骤可快速排除“路由未命中、方法不允许、缓存未更新”等应用层问题。
五、快速排查清单
- 核对 Web 服务器根目录是否为项目 public;
- 核对 mod_rewrite 已启用(Apache),或 try_files 配置正确(Nginx);
- 核对 AllowOverride All 已设置(Apache);
- 核对目录权限与 SELinux/AppArmor(若启用)未拦截;
- 核对 .htaccess 未被覆盖或删除;
- 执行 php artisan route:clear 并重新访问;
- 使用 php artisan route:list 确认路由是否存在且方法匹配;
- 查看 storage/logs/laravel.log 与 Web 服务器错误日志获取具体报错。