mod_rewrite中如何复用RewriteCond分组匹配结果处理多规格图片?
解决mod_rewrite中捕获RewriteCond分组并在RewriteRule中使用的问题
核心结论
RewriteCond中的分组捕获需用%N(N为数字,从1开始)引用,$N仅用于引用RewriteRule自身的分组。针对你需要匹配x1_到x19_前缀的场景,可按以下方式调整规则:
修正后的规则
RewriteEngine On # 原图片文件不存在时才执行后续规则 RewriteCond %{DOCUMENT_ROOT}/$1/$2.jpg !-f # 匹配x1_到x19_的前缀并捕获,对应%1 RewriteCond %{DOCUMENT_ROOT}/$1/(x(?:[1-9]|1[0-9])_)$2.jpg -f # 使用%1引用RewriteCond中捕获的前缀 RewriteRule ^(site/views/00_projects/[^/]+/content/image/[^/]+)/([^/]+)\.(?:png|jpg|gif)$ $1/%1$2.jpg [T=image/jpeg,L]
关键说明
- 反向引用差异:
$1、$2:对应RewriteRule正则里捕获的分组(比如$1匹配路径中的site/views/00_projects/.../image/xxx部分)。%1:对应紧邻RewriteRule的最后一个RewriteCond中的第一个捕获分组(即匹配到的xN_前缀,如x5_、x19_)。
- 前缀匹配正则:
x(?:[1-9]|1[0-9])_用非捕获组(?:...)实现逻辑分组,确保外层捕获组直接拿到完整前缀,避免占用额外反向引用位置。 - 规则逻辑:先判断原文件不存在,再检测带前缀的文件存在,避免无效重写。
调试提示
若规则未生效,可检查:
- 服务器是否已启用mod_rewrite模块。
- 规则是否放置在
.htaccess或虚拟主机配置的正确位置。 - 通过服务器日志(如Apache的error_log)查看重写匹配的细节。
内容的提问来源于stack exchange,提问作者Diego Flores
相关产品推荐
相关产品推荐

