多站点子目录CSS的.htaccess重写规则失效问题排查
多域名站点CSS资源自动加载的.htaccess规则问题排查与解决
问题根源
- 重写循环与无存在性检查:原规则直接重写路径,既没排除已指向域名子目录的请求,也没检查目标文件是否存在,会导致重复重写或指向不存在的文件,最终返回404。
- HTTP_HOST含端口号:如果访问时带端口(比如
localhost:8080),%{HTTP_HOST}会包含端口部分,而你的目录名大概率是纯域名,导致重写路径错误。
修复后的.htaccess配置
RewriteEngine On # 跳过已指向域名子目录的请求,避免循环重写 RewriteRule ^assets/css/[a-zA-Z0-9.-]+/(.*)$ - [L] # 提取不带端口的域名部分 RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9.-]+)(:[0-9]+)?$ # 确认目标CSS文件存在后再重写 RewriteCond %{DOCUMENT_ROOT}/assets/css/%1/$1 -f RewriteRule ^assets/css/(.*)$ assets/css/%1/$1 [L] # 原有路由转发规则,保持不变 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L]
配置细节说明
- 防循环规则:匹配
assets/css/域名/xxx.css格式的请求,直接跳过后续重写规则,避免路径被反复拼接。 - 纯域名提取:通过正则捕获
HTTP_HOST中不带端口的核心域名部分,解决带端口访问时路径不匹配的问题。 - 存在性校验:先检查目标文件是否存在,只有文件真实存在时才执行重写,避免无效路径导致的404。
额外注意事项
- 确保对应域名的CSS目录和文件已创建,比如访问
example.com时,assets/css/example.com/styles.css必须存在。 - 若仍有问题,可开启Apache重写日志(设置
RewriteLogLevel 3),查看规则匹配过程,定位具体问题。
内容的提问来源于stack exchange,提问作者Alvin
相关产品推荐
相关产品推荐

