htaccess使用rewriterrule条件中匹配的第二组



我使用mod_rewrite与这个规则:

RewriteCond %{DOCUMENT_ROOT}/$1/$2.jpg !-f
RewriteCond %{DOCUMENT_ROOT}/$1/x19_$2.jpg -f
RewriteRule ^(site/views/00_projects/[^/]+/content/image/[^/]+)/([^/]+).(?:png|jpg|gif)$ $1/x19_$2.jpg [T=image/jpeg,L]

x19_可以是多个值,如x1_~x19_

是否有一种方法可以捕获RewriteCond组匹配并在RewriteRule结果中使用?

我已经试图从RewriteCond中获得(x(?:[1-9]|1[0-9])_),并在RewriteRule上使用它作为背景参考,但它没有成功-似乎$%变量都没有得到组:(

不,不幸的是,您不能在.htaccess中这样做。您不能基于模式测试文件是否存在—这将需要mod_rewrite有效地遍历目录以查找匹配的文件。没有这样的机制。您需要为每个要测试的文件使用单独的规则—请参阅"解决方案"。下面。

我已经试图从RewriteCond中获得(x(?:[1-9]|1[0-9])_),并在RewriteRule上使用它作为背景参考,但它没有成功-似乎$%变量都没有得到组:(

RewriteCond指令的第一个参数(TestString)是一个"普通的";字符串(允许反向引用/变量解析),而不是正则表达式。因此,字符(x(?:[1-9]|1[0-9])_)将被视为文字,条件很可能会失败。


RewriteCond %{DOCUMENT_ROOT}/$1/$2.jpg !-f
RewriteCond %{DOCUMENT_ROOT}/$1/x19_$2.jpg -f
RewriteRule ^(site/views/00_projects/[^/]+/content/image/[^/]+)/([^/]+).(?:png|jpg|gif)$ $1/x19_$2.jpg [T=image/jpeg,L]

旁白:这个规则本身并没有真正意义(或者是不完整的)。您正在检查所请求的url路径末尾的.png.jpg.gif,但是,您随后检查相应的.jpg(only)文件是否不存在。因此,如果存在.jpg文件(即使请求了.png文件),则不会处理规则。也许这样做的目的是防止在请求文件存在的情况下进行进一步处理(我将假设存在),但如果存在,则可以简化第一个条件。


"Solution">

由于请求中没有任何可以作为条件基础的内容,因此您需要为要检查的每个文件设置单独的规则,按照优先级顺序-先匹配优先。

然而,多个规则可以通过早期失败(如果您在此请求上没有其他需要处理的规则)或在条件不匹配时跳过规则来简化。

例如:

# Skip the following 20 rules if the URL-path does not match
# (file check + x1 to x19 = 20 rules)
RewriteRule !^site/views/00_projects/[^/]+/content/image/[^/]+/[^/]+.(png|jpg|gif)$ - [S=20]
# Abort early if the request already maps to a physical file
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# Check for x1 jpg
RewriteCond %{DOCUMENT_ROOT}/$1/x1_$2.jpg -f
RewriteRule ^(.+)/([^/]+).(png|jpg|gif)$ $1/x1_$2.jpg [T=image/jpeg,L]
# Check for x2 jpg
RewriteCond %{DOCUMENT_ROOT}/$1/x2_$2.jpg -f
RewriteRule ^(.+)/([^/]+).(png|jpg|gif)$ $1/x2_$2.jpg [T=image/jpeg,L]
# Check for x3 jpg
RewriteCond %{DOCUMENT_ROOT}/$1/x3_$2.jpg -f
RewriteRule ^(.+)/([^/]+).(png|jpg|gif)$ $1/x3_$2.jpg [T=image/jpeg,L]
# etc.
:
# Check for x19 jpg
RewriteCond %{DOCUMENT_ROOT}/$1/x19_$2.jpg -f
RewriteRule ^(.+)/([^/]+).(png|jpg|gif)$ $1/x19_$2.jpg [T=image/jpeg,L]

后续规则中的RewriteRule模式。检查是否有x1"到"x19")可以简化,因为我们已经在第一条规则中建立了请求的url路径与所需的模式匹配。

最新更新