Laravel站点public目录下CSS、JS、图片等静态资源访问返回404错误
Laravel静态资源不加public前缀返回404问题解决方案
问题根因
你当前的问题是站点根目录指向了Laravel项目的根目录,而非官方推荐的public目录,同时你编写的重写规则逻辑存在问题:原规则判断当前请求路径对应的文件/目录在项目根目录存在才重写到public目录,但静态资源本身存放在public下,项目根目录并不存在对应路径的文件,因此重写规则不会触发,最终返回404。
解决方案
方案1:调整Web服务器站点根目录(官方推荐)
这是最安全且规范的解决方式,直接修改Web服务器配置:
- Apache:修改VirtualHost配置中的
DocumentRoot参数,取值改为你的Laravel项目完整路径加/public后缀,例如DocumentRoot /var/www/laravel-project/public - Nginx:修改Server配置中的
root参数,取值同上
修改后重启Web服务器即可直接通过http://domain.test/js/xxx.js访问资源。
方案2:修改根目录.htaccess规则(仅适用于无法调整站点根目录的场景,例如共享主机限制)
将你根目录的.htaccess内容替换为以下配置:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理Authorization头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 静态资源重定向到public目录 RewriteCond %{REQUEST_URI} !^/public/ RewriteCond %{DOCUMENT_ROOT}/public/$1 -f [OR] RewriteCond %{DOCUMENT_ROOT}/public/$1 -d RewriteRule ^(.*)$ /public/$1 [L] # 非目录路径去除尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 剩余请求交给前端控制器 RewriteRule ^ index.php [L] </IfModule>
额外检查项
- 确认Apache已开启
mod_rewrite模块,且站点配置中已设置AllowOverride All,否则.htaccess规则不会生效 - 检查
public目录及内部资源文件的权限,确保Web服务器运行用户有读取权限,常规权限设置为目录755、文件644即可 - 确认.env配置文件中
APP_URL没有/public后缀,取值为你的站点根域名即可,例如APP_URL=http://domain.test
内容的提问来源于stack exchange,提问作者B L Praveen
相关产品推荐
相关产品推荐

