You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:27:04