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

如何使用RewriteCond和RewriteRule实现特定文件不存在时的重写

Apache Rewrite规则配置方案

刚好碰到过类似的场景,我来给你整理一套精准的规则配置,完全匹配你的需求:

首先,确保你的Apache已经启用了mod_rewrite模块,然后在网站根目录的.htaccess文件(或者对应的虚拟主机配置块)里添加以下规则:

# 开启Rewrite引擎
RewriteEngine On

# 场景1:根目录的sw.js存在时,直接返回原文件,不执行任何重写
RewriteCond %{DOCUMENT_ROOT}/sw.js -f
RewriteRule ^sw.js$ - [L]

# 场景2:根目录sw.js不存在,但folder1/sw.js存在时,重写请求
RewriteCond %{DOCUMENT_ROOT}/sw.js !-f
RewriteCond %{DOCUMENT_ROOT}/folder1/sw.js -f
RewriteRule ^sw.js$ /folder1/sw.js [L]

# 场景3:根目录和folder1的sw.js都不存在,但folder2/sw.js存在时,重写请求
RewriteCond %{DOCUMENT_ROOT}/sw.js !-f
RewriteCond %{DOCUMENT_ROOT}/folder1/sw.js !-f
RewriteCond %{DOCUMENT_ROOT}/folder2/sw.js -f
RewriteRule ^sw.js$ /folder2/sw.js [L]

规则细节解释:

  • %{DOCUMENT_ROOT}:Apache的环境变量,指向你的网站文件系统的根目录,确保路径判断的准确性。
  • -f:RewriteCond的测试标志,用来判断指定路径的文件是否存在;!-f则是反向判断(文件不存在)。
  • ^sw.js$:精准匹配请求路径为根目录下sw.js的请求,避免影响其他文件的访问。
  • [L]:Last标志,执行完当前规则后停止后续Rewrite规则的处理,确保逻辑优先级正确。
  • 第一组规则里的-表示不做任何重写操作,直接返回原请求的资源(此时根目录的sw.js存在)。

逻辑优先级说明:

规则是按从上到下的顺序执行的:

  1. 先检查根目录的sw.js是否存在,存在则直接返回,跳过后续所有规则。
  2. 若根文件不存在,再检查folder1/sw.js,存在就重写过去并停止处理。
  3. 若前两个都不存在,最后检查folder2/sw.js,存在就重写过去。

这样就完美实现了你想要的“依次检查、存在则重写”的逻辑。

内容的提问来源于stack exchange,提问作者Ayoob G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:59:13