Apache Rewrite规则添加物理文件与目录例外的技术问询
解决Rewrite规则的物理文件/目录例外问题
直接给你写好带例外条件的完整规则,完美适配你的需求:
# 排除存在的物理目录和物理文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # 仅当上述条件都满足时,执行重写 RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]
每条规则的作用解释:
RewriteCond %{REQUEST_FILENAME} !-d:当请求的路径不是服务器上存在的物理目录时,才继续往下走。!-d里的!表示“否定”,-d是Apache的内置检测符,用来判断请求路径是否为一个真实存在的目录。RewriteCond %{REQUEST_FILENAME} !-f:这条和上面的逻辑类似,当请求的路径不是服务器上存在的物理文件时,才进入后续的重写规则。-f用来检测请求路径是否为一个真实存在的普通文件。- 两条
RewriteCond是“且”的关系,只有同时满足(既不是存在的目录,也不是存在的文件),才会触发后面的RewriteRule,把example.com/anything/这类请求重写到example.com/anything.html。
实际场景验证:
- 如果你的服务器上有
example.com/test/这个物理目录,当用户请求example.com/test/时,第一条RewriteCond就不满足(因为test/是真实存在的目录),所以不会执行重写,直接加载该目录下的索引页(比如index.html)。 - 如果服务器上不存在
test/目录,也不存在test这个物理文件,那请求example.com/test/就会被正常重写到example.com/test.html。 - 如果用户直接请求一个存在的物理文件(比如
example.com/contact.txt),第二条RewriteCond会判定该路径是真实文件,所以不会触发重写,直接返回该文件内容。
内容的提问来源于stack exchange,提问作者asdfqwerzxcv
相关产品推荐
相关产品推荐

