根本原因是Web服务器未将public/设为文档根目录,导致请求路径多出/public/前缀;必须配置Apache的DocumentRoot或Nginx的root指向project-root/public,并使用asset()生成资源链接,禁用手动添加/public/前缀。

根本原因不是 Laravel 本身出错,而是 Web 服务器没把 public/ 目录当成网站根目录,导致浏览器请求的路径带上了多余的 /public/ 前缀,比如 /public/css/app.css,而服务器实际只认 /css/app.css。
Web 服务器根目录没指向 public
这是最常见、也最容易被忽略的问题。Laravel 所有公开可访问的文件(CSS、JS、图片、index.php)都必须放在 public/ 目录下,且 Web 服务器(Apache/Nginx/phpEnv)的文档根目录(DocumentRoot / root)必须设置为该项目的 public 子目录,而不是整个项目根目录。
- Apache:检查虚拟主机配置中
DocumentRoot是否为/your-project-path/public,同时确认<Directory>指向同一路径,并启用AllowOverride All - Nginx(含 phpEnv):在站点设置里把“网站目录”或
root明确改为/your-project-path/public;保存后重载 Nginx,不要重启服务 - php artisan serve:默认已正确指向
public/,无需改配置,但仅适合开发调试
静态资源链接用了相对路径
当路由是多级路径(如 /admin/users)时,如果模板里写 <link rel="stylesheet" href="css/app.css">,浏览器会以当前 URL 为基准解析成 /admin/css/app.css,自然 404。
- 所有静态资源引用必须用 Laravel 的
asset()辅助函数:<link rel="stylesheet" href="{{ asset('css/app.css') }}"> -
asset()会自动拼上APP_URL配置值(如http://localhost),生成绝对路径,不受当前路由深度影响 - 切勿手动加
/public/前缀,比如{{ asset('public/css/app.css') }}—— 这会导致路径变成/public/public/css/app.css,彻底错误
Nginx 伪静态规则缺失或写错
即使根目录设对了,如果 Nginx 没把非真实文件的请求兜底给 index.php,部分资源(尤其是带版本号的缓存文件)仍可能 404。
- 必须在
location /块中配置:try_files $uri $uri/ /index.php?$query_string; - 删除网上常见的
rewrite ^/(.*)$ /index.php? last;写法——它过时、低效,还容易引发 PATH_INFO 解析失败 - 确保
location ~ \.php$块中包含这三行(尤其注意$realpath_root):fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param REQUEST_URI $request_uri;
权限或环境配置干扰
少数情况下,系统级限制也会阻断资源加载。
- Linux 下检查
public/目录权限是否为755,确保 Web 服务器进程(如 www-data 或 nginx)有读取权限 - 确认
.env中APP_URL与你实际访问的域名或地址完全一致(例如本地开发用http://localhost,不能漏掉http://) - 清空配置和视图缓存:
php artisan config:clear && php artisan view:clear,避免旧缓存误导判断


















