Laravel 5.4所有路由均报NotFoundHttpException问题求助
排查Laravel 5.4全路由返回NotFoundHttpException的问题
我来帮你一步步排查这个Laravel 5.4的路由404问题,这种全路由失效的情况通常和服务器配置、路由缓存或者访问路径有关,咱们逐个来核对:
1. 优先检查服务器重写规则配置
Laravel依赖URL重写来把所有请求导向public/index.php,这是最常见的404触发原因:
Apache环境:
- 确保
mod_rewrite模块已经开启。你可以通过phpinfo()页面查看,或者在Apache主配置里确认LoadModule rewrite_module modules/mod_rewrite.so没有被注释。 - 检查项目
public/.htaccess文件是否存在,默认内容应该如下:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] </IfModule> - 如果项目放在Apache子目录(比如
bradforduniversityproject),需要确认虚拟主机配置中的AllowOverride设置为All,否则.htaccess的规则不会生效。
- 确保
Nginx环境:
确保站点配置包含正确的try_files规则,示例配置如下:server { listen 80; server_name localhost; root /path/to/your/bradforduniversityproject/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # 根据你的PHP版本调整路径 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }
2. 确认访问路径是否正确
你当前访问的http://localhost/bradforduniversityproject/public/虽然可行,但更推荐两种更稳妥的方式:
- 使用Laravel内置服务器:在项目根目录执行
php artisan serve,然后访问http://localhost:8000,会自动指向public目录,避免路径拼接错误。 - 配置虚拟主机:把站点根目录直接指向
bradforduniversityproject/public,这样访问http://your-local-domain就能直接进入项目,无需额外拼接public后缀。
3. 路由缓存的隐藏坑
你已经执行了php artisan route:clear,但要注意一个关键细节:
- 如果之前执行过
php artisan route:cache,而你的路由里包含闭包路由(比如示例中的Route::get('auth/test',function(){ return "asd"; });),路由缓存会直接失效!因为Laravel无法序列化闭包函数。这种情况下可以手动删除bootstrap/cache/routes.php文件彻底清除缓存残留。 - Laravel 5.4中,
route:cache仅支持控制器路由,完全不兼容闭包路由,所以如果路由里有闭包,绝对不能使用这个命令。
4. 检查.env配置和目录权限
- 确认
.env文件中的APP_URL和你实际访问的地址一致,比如:APP_URL=http://localhost/bradforduniversityproject/public - 确保
storage/和bootstrap/cache/目录有写入权限,服务器用户(比如www-data)需要能读写这两个目录,否则可能导致路由加载失败。可以执行以下命令设置权限:chmod -R 755 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache # 根据你的服务器用户调整
5. 最后验证路由列表
执行php artisan route:list命令,查看所有定义的路由是否正常显示。如果命令能列出你的api/auth/test和web路由,说明路由定义本身没问题,问题肯定出在服务器配置或访问路径上;如果命令报错,那大概率是路由文件(web.php/api.php)存在语法错误(比如遗漏分号、括号不匹配等)。
内容的提问来源于stack exchange,提问作者Umair Malik
相关产品推荐
相关产品推荐

