使用.htaccess重定向至web文件夹文件时遇404及静态资源加载问题
这个问题我碰到过好多次,核心原因就是浏览器解析静态资源路径的逻辑和你服务器的重写规则不匹配,咱们一步步来解决:
问题根源
当你访问/admin/mybusinessadminpannel时,服务器把请求重写到了web/index.html,但浏览器会认为当前的"所在目录"是/admin/。你的CSS引用是../web/css/bootstrap.min.css,浏览器会把它解析成/admin/web/css/bootstrap.min.css——可你的资源实际在根目录下的/web/css/里,自然就返回404了。
解决方案
方案1:修改静态资源为绝对路径(最简单直接)
把所有静态资源的引用改成以斜杠开头的绝对路径,让浏览器直接从网站根目录找资源:
<link href="/web/css/bootstrap.min.css" rel='stylesheet' type='text/css' /> <script src="/web/js/jquery.min.js"></script>
如果你的站点不是部署在服务器根目录(比如是http://example.com/my-site/),可以在页面的<head>里加个<base>标签统一基准路径:
<head> <base href="/my-site/" /> <!-- 之后的相对路径都会以这个base为基准 --> <link href="web/css/bootstrap.min.css" rel='stylesheet' type='text/css' /> </head>
方案2:给重写规则加过滤条件(不用改前端代码)
如果你不想动前端的资源路径,可以在.htaccess里加规则,让真实存在的静态资源请求跳过重写:
# 先判断:如果请求的是真实存在的文件、目录或符号链接,直接放行 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -l RewriteRule ^ - [L] # 再放你的重写规则 RewriteRule ^admin/mybusinessadminpannel web/index.html [NC,L]
这个逻辑是:服务器先检查请求的路径是不是真实存在的资源,如果是,就直接返回,不会走后面的重写规则,这样静态资源就能正常加载了。
额外注意事项
- 确保你的
.htaccess文件放在网站根目录,而不是web文件夹里; - 如果用的是Apache服务器,要确认
mod_rewrite模块已经开启,并且站点配置里的AllowOverride All已经设置正确,否则重写规则不会生效。
内容的提问来源于stack exchange,提问作者Thalinda Bandara
相关产品推荐
相关产品推荐

