如何配置Apache .htaccess重写规则,避免影响CSS、JS等静态资源加载
现有配置错误原因
- 规则执行顺序错误:兜底的
/index.php重写规则带有[L]标记,匹配后会终止后续所有规则执行,写在它后面的伪目录规则永远不会生效。 - 伪目录规则缺少前置排除逻辑:没有对静态资源、已存在文件/目录做排除,会错误拦截静态资源请求,导致页面样式、脚本、图片加载失败。
- RewriteCond作用范围限制:RewriteCond仅对紧邻它的下一条RewriteRule生效,你原本注释的dictionary规则没有对应排除条件,会无差别拦截所有路径匹配的请求。
修正后的完整.htaccess配置
Options +SymLinksIfOwnerMatch <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 排除静态资源、指定目录、PHP文件请求,直接放行不重写 RewriteCond %{REQUEST_URI} ^/(images|css|js|scripts)/ [NC,OR] RewriteCond %{REQUEST_URI} \.(css|js|jpe?g|gif|png|php)$ [NC] RewriteRule ^ - [L] # 已存在的文件、目录直接放行,不做重写 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 自定义伪目录重写规则,需要新增直接按格式加行即可,QSA自动携带原有查询字符串 RewriteRule ^dictionary/(.*)$ dictionary.php [NC,L,QSA] # 以下为其他4个伪目录示例,可按实际需求修改 RewriteRule ^faq/(.*)$ faq.php [NC,L,QSA] RewriteRule ^blog/(.*)$ blog.php [NC,L,QSA] RewriteRule ^product/(.*)$ product.php [NC,L,QSA] RewriteRule ^docs/(.*)$ docs.php [NC,L,QSA] # 原有dict路径特殊处理,前置到兜底规则之前 RewriteRule ^dict/[^/]+/[^/]+/(.+)$ $1 [L] # 不存在的路径兜底重写到index.php RewriteRule ^ /index.php [L] </IfModule>
配置说明
- 前置的排除规则优先处理所有静态资源、PHP文件、指定目录的请求,彻底避免静态资源路径错误问题,也保证dictionary.php引入的其他PHP文件不会被重写,完全符合第一个需求。
- 已存在的文件、目录提前放行,不存在的路径才会进入后续重写逻辑,符合第二个需求。
- 伪目录规则统一放在兜底规则之前,
QSA标记会自动携带原请求的查询字符串,新增伪目录仅需要按照格式新增一行对应规则即可。 - 如果需要匹配
/dictionary根路径(无后续路径参数)的请求,将对应规则的匹配模式改为^dictionary(?:/(.*))?$即可。
内容的提问来源于stack exchange,提问作者Aldo Cauchi Savona
相关产品推荐
相关产品推荐

