在 apache 的 rewritecond 中判断文件路径是否包含特定扩展名,最可靠的方法是使用正则表达式匹配 %{request_filename}。通过设置条件为 -f(检查物理文件是否存在)并配合正则模式,可以精准拦截如 .jpg、.png 等静态资源请求。若需排除这些扩展名,只需在正则前添加 ! 符号即可。

如何配置规则以拦截 .jpg 和 .png 请求
要拦截特定扩展名的请求,需在 RewriteRule 之前添加对应的 RewriteCond。以下代码演示了如何拦截所有存在的 .jpg 或 .png 文件请求,并将其重定向到维护页面。

<ifmodule mod_rewrite.c>
RewriteEngine On
# 拦截存在的 .jpg 或 .png 文件
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.(jpg|png)$ [NC]
RewriteRule ^(.*)$ /maintenance.html [L,R=302]
</ifmodule>
上述配置中,-f 确保只处理实际存在的文件,避免对不存在的 URL 产生副作用。\.(jpg|png)$ 使用正则匹配文件名结尾的扩展名,[NC] 表示不区分大小写。当请求 /images/logo.jpg 且该文件存在时,服务器将返回 302 重定向至 maintenance.html。
如何排除特定扩展名以允许正常访问
若希望允许某些扩展名正常访问而拦截其他类型,可在正则前添加 ! 进行否定匹配。例如,允许 .html 和 .css 文件正常加载,但拦截其他动态脚本请求。

Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<ifmodule mod_rewrite.c>
RewriteEngine On
# 允许存在的 .html 或 .css 文件
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} !\.(html|css)$ [NC]
RewriteRule ^(.*)$ /error.php [L,QSA]
</ifmodule>
此配置中,!\.(html|css)$ 表示如果请求的文件不是 .html 或 .css 扩展名,则触发规则。结合 -f 条件,仅当文件存在且扩展名不符合白名单时,才会重定向至 error.php。这种写法常用于保护非公开资源或统一错误处理入口。
基于 REQUEST_FILENAME 变量匹配的具体行为验证
在使用 %{REQUEST_FILENAME}进行匹配时,需注意其值为服务器上的完整物理路径,而非 URL 路径。例如,请求 /test.jpg 时,%{REQUEST_FILENAME} 可能为 /var/www/html/test.jpg。因此,正则表达式应针对文件名部分进行匹配,而非整个路径。
以下测试用例验证了不同输入下的行为:
- 请求
/image.png(文件存在):触发拦截规则,重定向至maintenance.html。 - 请求
/script.js(文件存在):不匹配.jpg|png,无重定向。 - 请求
/missing.jpg(文件不存在):-f条件失败,无重定向。
这些结果符合预期,证明 -f 与正则组合能精确控制扩展名过滤逻辑。









