Apache下Laravel子目录资源404:.htaccess配置解决方案
解决Laravel下Angular构建资源路径404的.htaccess配置方案
这个问题的核心是Angular构建时默认把资源路径设为根目录下的/assets/,但你的资源实际存放在public/dashboard-dist/assets/里,所以请求会找不到对应文件。不用修改Angular代码,只需要在Laravel的public/.htaccess里加几条重写规则就能搞定,具体步骤如下:
步骤1:修改public/.htaccess文件
打开你的Laravel项目根目录下的public/.htaccess,找到Laravel默认的"Send Requests To Front Controller..."这段规则,在它之前添加以下重写规则:
# 重写Angular Dashboard的资源请求到正确路径 RewriteCond %{REQUEST_URI} ^/assets/ RewriteCond %{DOCUMENT_ROOT}/dashboard-dist%{REQUEST_URI} -f RewriteRule ^assets/(.*)$ dashboard-dist/assets/$1 [L]
修改后的完整.htaccess大概是这样的:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 重写Angular Dashboard的资源请求到正确路径 RewriteCond %{REQUEST_URI} ^/assets/ RewriteCond %{DOCUMENT_ROOT}/dashboard-dist%{REQUEST_URI} -f RewriteRule ^assets/(.*)$ dashboard-dist/assets/$1 [L] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
规则解释
- 第一条
RewriteCond:匹配所有以/assets/开头的资源请求(比如你的bootstrap.min.css请求) - 第二条
RewriteCond:检查这个资源是否实际存在于dashboard-dist目录下(比如验证public/dashboard-dist/assets/css/bootstrap.min.css是否存在) RewriteRule:把请求的/assets/xxx路径重写成/dashboard-dist/assets/xxx,[L]标记表示执行这条规则后就停止后续规则,避免干扰Laravel的正常路由
额外注意事项
- 确保你的Apache服务器已经启用了
mod_rewrite模块(这是Laravel运行的必要条件,一般生产环境都已经配置好了) - 如果你的Angular应用还有其他非
/assets/开头的资源,只需要调整第一条RewriteCond的匹配规则即可,比如如果有/js/开头的资源,就改成RewriteCond %{REQUEST_URI} ^/(assets|js)/
这样配置后,你不用修改任何Angular代码,所有资源请求都会自动被转发到正确的路径,不管是本地测试还是部署到生产服务器都能直接生效。
内容的提问来源于stack exchange,提问作者moonwalker
相关产品推荐
相关产品推荐

