You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Rewrite规则:快照目录无文件时跳转至归档目录

解决Rewrite规则适配快照与归档目录的问题

没问题,我来帮你调整Rewrite规则,实现先检查快照目录,不存在则自动转向归档目录的需求。

思路解析

我们需要分两步处理请求:

  1. 优先检查目标文件是否存在于快照目录/pub/$2/snapshots/$1,如果存在就重写过去;
  2. 如果快照目录里找不到文件,再重写到归档目录/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:36