如何配置Rewrite规则:快照目录无文件时跳转至归档目录
解决Rewrite规则适配快照与归档目录的问题
没问题,我来帮你调整Rewrite规则,实现先检查快照目录,不存在则自动转向归档目录的需求。
思路解析
我们需要分两步处理请求:
- 优先检查目标文件是否存在于快照目录
/pub/$2/snapshots/$1,如果存在就重写过去; - 如果快照目录里找不到文件,再重写到归档目录
/pub/archive/$1。
Apache的Rewrite规则是从上到下执行的,所以我们可以把“快照存在”的规则放在前面,匹配成功就停止处理;未匹配的请求自动进入下一条规则,转向归档。
最终配置代码
# 规则1:优先匹配快照目录中存在的文件 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^/((ffmpeg|ffprobe|ffserver|ffplay)-[0-9]+-g[0-9a-z]+\.(?:7z|dmg))$ RewriteCond %{DOCUMENT_ROOT}/pub/%2/snapshots/%1 -f RewriteRule ^ /pub/%2/snapshots/%1 [L] # 规则2:快照目录不存在时,转向归档目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^((ffmpeg|ffprobe|ffserver|ffplay)-[0-9]+-g[0-9a-z]+\.(?:7z|dmg))$ /pub/archive/$1 [L]
关键细节解释
RewriteCond %{REQUEST_FILENAME} !-f:确保当前请求的路径下没有实际存在的文件,避免误重写已有文件。RewriteCond %{REQUEST_URI} ^/((ffmpeg|ffprobe|ffserver|ffplay)-[0-9]+-g[0-9a-z]+\.(?:7z|dmg))$:在条件中捕获文件名(%1)和工具名称(%2),用来后续检查快照目录的文件是否存在。RewriteCond %{DOCUMENT_ROOT}/pub/%2/snapshots/%1 -f:用绝对路径(结合%{DOCUMENT_ROOT})检查快照目录中的目标文件是否存在,避免相对路径的歧义。[L]标记:表示匹配成功后停止后续规则的处理,确保快照存在的请求不会被归档规则干扰。
简化版可选配置
如果你觉得两条规则有点繁琐,也可以合并成一条规则,通过条件判断快照文件不存在时直接重写归档:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^((ffmpeg|ffprobe|ffserver|ffplay)-[0-9]+-g[0-9a-z]+\.(?:7z|dmg))$ /pub/%2/snapshots/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/pub/%2/snapshots/%1 !-f RewriteRule ^((ffmpeg|ffprobe|ffserver|ffplay)-[0-9]+-g[0-9a-z]+\.(?:7z|dmg))$ /pub/archive/$1 [L]
这个版本和上面的逻辑完全一致,只是把快照存在的检查移到了第二条规则的条件里,看你个人习惯选择即可。
内容的提问来源于stack exchange,提问作者tessus
相关产品推荐
相关产品推荐

