Laravel子目录部署CSS 404的根本原因是asset()未生成带子目录前缀的URL,且Web服务器根目录未正确指向public/;需配置$_SERVER['SCRIPT_NAME']、RewriteBase(Apache)或alias(Nginx),并清空缓存。

你在本地开发时把Laravel项目放在子目录(比如http://localhost/myapp/)下,但CSS始终404——不是文件没放对位置,而是asset()生成的路径漏掉了子目录前缀,浏览器请求的是/css/app.css而非/myapp/css/app.css。
确认public目录是Web根目录
打开你的Web服务器配置,确保DocumentRoot或root指向的是Laravel项目的public/目录,而不是整个项目根目录。如果指向了/var/www/html/myapp/(即项目根),那Laravel根本不会启动,你看到的只会是文件列表或500错误——【这是所有路径问题的根源,必须先解决】。
Apache用户检查httpd.conf或虚拟主机配置里的DocumentRoot;Nginx用户检查server块中的root指令,它必须是/path/to/myapp/public,不能是/path/to/myapp。
让asset()识别子目录路径
第一步:打开public/index.php,在require __DIR__.'/../vendor/autoload.php';这一行前面插入:
立即学习“前端免费学习笔记(深入)”;
$_SERVER['SCRIPT_NAME'] = '/myapp/index.php';
注意:这里/myapp要和你实际访问的URL路径完全一致(包括开头的斜杠),不能写成myapp/或myapp/index.php。这一步告诉PHP当前脚本的入口路径,asset()会据此生成带前缀的URL。
第二步:清空Laravel缓存,执行php artisan config:clear和php artisan view:clear,否则旧的URL缓存还在生效。
第三步:在Blade中用{{ asset('css/app.css') }},此时会正确输出/myapp/css/app.css而非/css/app.css。
Apache下.htaccess的RewriteBase必须配准
方法一:打开public/.htaccess,找到RewriteBase /这一行,把它改成:
RewriteBase /myapp/
这个值必须和你在index.php里写的SCRIPT_NAME前缀保持一致,且末尾带斜杠。不改这一行,CSS、JS、图片等静态资源全部404——因为mod_rewrite不知道重写规则该从哪一级开始算起。
方法二(不推荐):删掉RewriteBase行,改用绝对路径引用,比如<link href="http://localhost/myapp/css/app.css" rel="stylesheet">。但这会让环境切换变得脆弱,上线后还得手动替换域名和路径。
Nginx子目录部署的重写补丁
如果你用Nginx,且项目放在/myapp/下,必须在server配置里加专属location块:
location ^~ /myapp/ { alias /path/to/your/project/public/; try_files $uri $uri/ @laravel;}location @laravel { rewrite ^/myapp/(.*)$ /myapp/index.php?/$1 last;}
【alias末尾必须有/,否则/static/css/app.css会被拼成/path/public/static/css/app.css,多出一层路径】。别用root代替alias,那是初学者最常踩的坑——root会在路径末尾自动追加location匹配的部分,导致双重嵌套。


















