如何使用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存在)。
逻辑优先级说明:
规则是按从上到下的顺序执行的:
- 先检查根目录的
sw.js是否存在,存在则直接返回,跳过后续所有规则。 - 若根文件不存在,再检查
folder1/sw.js,存在就重写过去并停止处理。 - 若前两个都不存在,最后检查
folder2/sw.js,存在就重写过去。
这样就完美实现了你想要的“依次检查、存在则重写”的逻辑。
内容的提问来源于stack exchange,提问作者Ayoob G
相关产品推荐
相关产品推荐

