用 RewriteCond %{REQUEST_FILENAME} -d 判断请求路径是否对应真实目录,因 %{REQUEST_FILENAME} 是服务器本地绝对路径,能准确检测磁盘目录存在性;不可用 %{REQUEST_URI} 配合 -d,因其仅为 URL 字符串。

判断请求路径是否对应一个真实存在的目录,用 RewriteCond 配合 -d 标志即可。
基本写法:检查目录是否存在
最常用、最直接的写法是:
-
RewriteCond %{REQUEST_FILENAME} -d—— 表示当前请求的完整文件系统路径是一个已存在的目录
注意:%{REQUEST_FILENAME} 是 Apache 自动拼接出的**服务器本地绝对路径**(如 /var/www/html/uploads),不是 URL 路径。它由 DocumentRoot + REQUEST_URI 组成,因此能准确反映磁盘上是否存在该目录。
常见组合用法
单独判断目录存在性意义有限,通常配合 RewriteRule 使用,典型场景包括“放行真实目录,跳过重写”:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 放行所有真实目录,避免后续规则干扰:
RewriteCond %{REQUEST_FILENAME} -d<br> RewriteRule ^ - [L] - 与文件存在性合并判断(推荐前置):
RewriteCond %{REQUEST_FILENAME} -f [OR]<br> RewriteCond %{REQUEST_FILENAME} -d<br> RewriteRule ^ - [L]
这样,只要请求的是真实文件或真实目录,就立即终止重写流程,不执行后面任何规则。
不能用 REQUEST_URI 直接判断目录
%{REQUEST_URI} 是 URL 中的路径部分(如 /admin/),它只是字符串,不经过文件系统解析。所以以下写法是错误的:
-
RewriteCond %{REQUEST_URI} -d❌(语法错误,-d只支持作用于文件系统路径变量) -
RewriteCond %{REQUEST_URI} ^/uploads/✅(这是纯字符串匹配,但无法确认该目录是否真实存在)
只有 %{REQUEST_FILENAME}、%{SCRIPT_FILENAME} 等表示物理路径的变量,才能配合 -d、-f 等资源检测标志使用。
其他相关资源判断标志
除 -d 外,同类型常用标志还有:
-
-f:判断是否为真实存在的普通文件 -
-s:判断是否为非空文件(即存在且 size > 0) -
-l:判断是否为符号链接
这些都要求左侧变量是可解析为磁盘路径的值,否则条件恒为假或报错。

















