mod_rewrite:将字符添加到back-reference-variable

时间:2013-09-10 13:23:54

标签: regex .htaccess mod-rewrite hyperlink

我有这样的网址

img/(thumb)?/([size])?/file.jpg

我希望将其重写为:

cache/file_thumb_[size].jpg

因为'size'和'thumb'部分是optinal,所以没有这些部分的url最后应该没有下划线。

有没有办法在一个规则中重写此内容?如果有办法在back-reference-variable中添加一个underscore_character,我可以解决这个问题。

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

1 个答案:

答案 0 :(得分:2)

不,仅当关联的反向引用可用时才会包含_。替换字符串不允许可以将其视为条件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