.htaccess配置FallbackResource后多级路径资源加载异常求助
这个问题本质是浏览器解析相对路径的逻辑导致的:当你访问多级路径(比如localhost/tax-information/school-authority-contact-information)时,浏览器会把页面里的相对路径(如css/style.css)解析成基于当前URL路径的地址(/tax-information/css/style.css),而这个路径并不存在物理文件,所以被你的FallbackResource规则转发到了home.php,返回的是HTML页面——这就是为什么你会看到Unexpected token <和MIME类型错误的原因。
下面给你几个实用的解决方案,不用全改绝对路径也能解决问题:
方法1:添加 标签统一相对路径解析规则
在HTML页面的<head>标签里添加<base>标签,指定网站的根路径。这样所有相对路径都会基于这个根路径来解析,和当前URL的层级无关。
比如你的项目部署在localhost/toh/下,就写:
<head> <base href="/toh/"> <!-- 其他meta、样式、脚本标签 --> </head>
如果是根域名部署(直接localhost/),就写<base href="/">。
这个方法最简单,只需要修改一次模板,所有相对路径都会自动指向正确的静态资源位置。
方法2:修改.htaccess,排除静态资源的重定向
通过添加Rewrite规则,让FallbackResource只作用于不存在的文件/目录,实际存在的静态资源(css、js、图片等)直接返回,不经过重定向。
修改你的.htaccess文件如下:
# 开启重写引擎 RewriteEngine On # 如果请求的是实际存在的文件或目录,直接返回,不执行后续规则 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 保留你的FallbackResource规则 FallbackResource home.php
这个方法更健壮,即使页面里不小心用了相对路径,静态资源也能正常加载,同时不影响URL重定向的逻辑。
方法3:用PHP常量统一管理根路径(替代硬编码绝对路径)
如果你不想用<base>标签,也可以在PHP里定义一个根路径常量,然后在模板里引用,避免手动写全路径的麻烦。
比如在home.php开头定义:
// 根据你的实际部署路径调整 define('BASE_URL', '/toh/');
然后在HTML里引用:
<link rel="stylesheet" href="<?php echo BASE_URL; ?>css/style.css"> <script src="<?php echo BASE_URL; ?>js/main.js"></script>
这样只需要维护一个常量,所有资源路径都会自动指向正确位置,比手动改每个路径要实用得多。
内容的提问来源于stack exchange,提问作者Zobris

