htaccess URL重写导致CSS/JS加载失败,如何添加资源访问例外规则?
问题根因
当前配置的重写条件(RewriteCond)仅会作用于紧随其后的第一条重写规则,仅单段路径的路由规则会判断请求是否对应真实存在的文件/目录,两段、三段路径的路由规则没有前置判断,因此assets/css/style.bundle.css这类三段路径的静态资源会被匹配为module=assets&view=css&id=style.bundle.css的路由请求,返回index.php内容而非静态资源。
修复方案
直接替换为以下.htaccess配置即可:
Options +Indexes Options +FollowSymlinks RewriteEngine On # 优先跳过所有静态资源请求,直接返回真实文件 RewriteRule \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ - [L,NC] # 单段路由:Module RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/?$ index.php?module=$1 [NC,L] # 两段路由:Module/View RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)/?$ index.php?module=$1&view=$2 [NC,L] # 三段路由:Module/View/Id RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?module=$1&view=$2&id=$3 [NC,L]
配置说明
- 第一条静态资源跳过规则优先级最高,只要请求后缀属于常见静态资源格式,直接终止重写逻辑,不会进入后续路由匹配
- 所有路由规则前都补充了真实文件/目录不存在的判断,确保只有非静态资源的请求才会走路由解析
- 调整了
Options配置的位置,符合Apache配置规范,避免规则加载顺序导致的失效问题
如有自定义后缀的静态资源,直接添加到第一条规则的后缀列表中即可。修改配置后重启Apache、清空浏览器缓存验证即可。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

