Regex mod_rewrite:将字符添加到后面的引用变量

Regex mod_rewrite:将字符添加到后面的引用变量,regex,.htaccess,mod-rewrite,hyperlink,Regex,.htaccess,Mod Rewrite,Hyperlink,我有一个像这样的url img/(thumb)?/([size])?/file.jpg 我想把它改写成这样: cache/file_thumb_[size].jpg 因为“size”和“thumb”部分是可选的,所以没有这些部分的url末尾不应该有下划线 有没有办法在one规则中重写这个?如果有办法在back引用变量中添加下划线字符,我可以解决这个问题 RewriteRule ^img/((thumb)\/)?(([a-z]+)\/)?([-_0-9a-zA-Z]+).([a-z]{3})$

我有一个像这样的url

img/(thumb)?/([size])?/file.jpg
我想把它改写成这样:

cache/file_thumb_[size].jpg
因为“size”和“thumb”部分是可选的,所以没有这些部分的url末尾不应该有下划线

有没有办法在one规则中重写这个?如果有办法在back引用变量中添加下划线字符,我可以解决这个问题

RewriteRule ^img/((thumb)\/)?(([a-z]+)\/)?([-_0-9a-zA-Z]+).([a-z]{3})$ cache/$5_$2_$4.$6

不,仅当相关的反向引用可用时,才可能包含
。替换字符串不允许被视为条件if-else include操作的内容

但是,通过将规则链接到

RewriteRule ^img/(?:(thumb)/)?(?:([a-z]+)/)?(\w+)\.([a-z]{3})$ cache/$3_$1_$2.$4 [C]
RewriteRule ^(.*?)__(.*)$ $1_$2 [C]
RewriteRule ^(.*?)_\.(.*)$ $1.$2 [L]
下面是文件名替换的过程

http://domain.com/img/thumb/small/file.jpg
 > Rule 1 > http://domain.com/cache/file_thumb_small.jpg

http://domain.com/img/thumb/file.jpg
 > Rule 1 > http://domain.com/cache/file_thumb_.jpg
  > Rule 3 > http://domain.com/cache/file_thumb.jpg

http://domain.com/img/small/file.jpg
 > Rule 1 > http://domain.com/cache/file__small.jpg
  > Rule 2 > http://domain.com/cache/file_small.jpg

http://domain.com/img/file.jpg
 > Rule 1 > http://domain.com/cache/file__.jpg
  > Rule 2 > http://domain.com/cache/file_.jpg
   > Rule 3 > http://domain.com/cache/file.jpg

很好的提示,但不幸的是代码不起作用。看起来不错,但在我的测试中,url“img/thumb/file.jpg”转换为“cache/file\u thumb\u.jpg/thumb/file.jpg”。第一条和最后一条规则应该有一个L标志,然后它就可以工作了!非常感谢。我更新了你的帖子。@Olli,也许你当前的Apache版本不支持
[C]
标志,但它们是必需的,因为它们将下一条规则链接到当前规则。如果没有它们,第二条和第三条规则将变得独立,并针对非图像URL路径启动。如果某一天您的文件或目录名中有
\uuu
.
,这将导致出现问题。第二条和第三条规则可能会导致
404
。只是一些你应该注意的事情。奇怪。。。昨天,它在2小时内不工作。。。现在它起作用了。好建议!非常感谢。