Laravel 404 根源在于服务器未将请求交由 public/index.php 处理,需确保根目录指向 public、启用伪静态(Apache 启用 .htaccess + AllowOverride All,Nginx 用 try_files)、正确配置环境与缓存。

不是 Laravel 路由写错了,而是服务器没把请求交给 public/index.php 处理。404 的根源几乎都出在根目录没指对、伪静态没启好、或环境没切过来。
网站根目录必须指向 public 子目录
Laravel 所有请求必须经过 public/index.php 入口,否则路由系统完全不工作,敏感目录还可能被直接访问。
- Apache:在
httpd-vhosts.conf对应站点块里,设DocumentRoot "D:/phpenv/www/your-app/public" - Nginx:在
nginx/conf/vhost/xxx.conf中,把root D:/phpenv/www/your-app;改成root D:/phpenv/www/your-app/public; - 改完务必重启 Apache 或 Nginx,否则
$_SERVER['DOCUMENT_ROOT']仍是旧路径
Apache 必须启用 .htaccess 并允许覆盖
phpEnv 的 Apache 默认禁用 .htaccess,即使 public 目录下已有规则文件,也会被忽略。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 确认
httpd.conf中已开启模块:LoadModule rewrite_module modules/mod_rewrite.so(去掉前面的 #) - 在虚拟主机配置的
<directory></directory>块内,写入:AllowOverride All(不能是None或FileInfo) - public 目录下的
.htaccess必须是 Laravel 官方标准内容,不要增删空行或注释:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,L]
Nginx 必须用 try_files,别碰 rewrite
Nginx 不读 .htaccess,也不能靠 rewrite 模仿 Apache 行为——容易循环重定向、丢参数、难排查。
- 在站点配置的
location / { }块中,删除所有rewrite行 - 只保留这一行:
try_files $uri $uri/ /index.php?$query_string; - 注意:必须是
$query_string,不是$args,否则?page=2这类参数会丢失 - 确保
fastcgi_param SCRIPT_FILENAME使用$realpath_root$fastcgi_script_name,避免符号链接问题
别忘了环境与缓存这步
页面能打开但点路由还是 404?很可能是环境没切、缓存没清、或 APP_URL 不匹配。
-
.env中设:APP_ENV=production、APP_DEBUG=false、APP_URL=https://yourdomain.com(末尾不加 /) - 执行命令清缓存:
php artisan config:clear && php artisan cache:clear && php artisan view:clear - 确保
storage/和bootstrap/cache/目录可写(Windows 下右键属性 → 取消“只读”) - 如果用了 CDN 或反向代理,需在
AppServiceProvider中补上URL::forceScheme('https')


















