Laravel 5.5页面无法访问异常问题技术求助
我来帮你一步步拆解这个奇怪的404问题,大概率是路由匹配、服务器配置或者缓存的锅,咱们逐个排查:
1. 先查路由优先级冲突
这是最常见的原因——你有没有在/categories这条路由之前定义过类似 Route::get('/{slug}', ...) 这种通配符路由?
Laravel的路由是按定义顺序匹配的,如果通配符路由在前,它会把/categories里的categories当成slug参数丢给对应的控制器,要是控制器找不到对应资源,就直接返回404了。而/t/blog这种带前缀的路径不会被这个通配符命中,所以能正常加载。
解决办法:把/categories、/blog这类明确的路由,挪到所有通配符路由的前面,确保先匹配到具体路径。
2. 验证服务器重写规则
Laravel依赖URL重写把所有请求导向index.php,如果服务器配置不对,直接访问根路径下的路由就会404,带前缀的反而正常。
Apache环境
检查项目根目录的.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>
另外还要确认Apache的mod_rewrite模块已启用,并且虚拟主机配置里设置了AllowOverride All,否则.htaccess不会生效。
Nginx环境
检查Nginx配置文件,确保location /块里有正确的try_files规则:
location / { try_files $uri $uri/ /index.php?$query_string; }
3. 清除路由缓存
如果你之前执行过 php artisan route:cache 生成了路由缓存,之后修改的路由不会自动更新——缓存里可能根本没有/categories这条路由,自然会404。
解决办法:执行这条命令清除缓存:
php artisan route:clear
开发环境建议不要用路由缓存,方便调试;生产环境更新路由后,记得重新执行route:cache。
4. 检查路由是否正确加载
执行 php artisan route:list,查看输出里有没有/categories这条路由,以及对应的控制器frontend\FrontendController@totalcategories是否正确。
如果看不到这条路由,说明路由没被加载:
- 检查这条路由是不是写在了正确的路由文件里(比如
routes/web.php); - 确认命名空间
frontend\FrontendController是否正确,有没有拼写错误,控制器文件是否存在于app/Http/Controllers/frontend目录下。
5. 移除无效的路由条件
最后提个小细节:你的/categories路由没有定义slug参数,但加了->where('slug', '[\w\d\-\_]+'),这个条件是无效的,虽然不会直接导致404,但建议去掉它,避免后续混淆。
内容的提问来源于stack exchange,提问作者mafortis

