rewritecond 不能直接限制文件类型,但可通过判断文件存在性或匹配扩展名实现跳过重写:先用 -f/-d 放行真实静态文件和目录,再用正则否定敏感后缀,最后路由主逻辑。

Apache 中 RewriteCond 不能直接“限制文件类型”,但可以通过检查请求路径是否对应真实存在的特定后缀文件,再结合逻辑否定,实现“跳过重写”的效果。核心思路是:**用 RewriteCond 判断请求是否命中某个文件(或目录),若是,则用 [L] 提前终止规则链,避免后续重写生效。**
匹配并放行常见静态资源文件
这是最常用的方式:对 .js、.css、.png、.jpg 等明确后缀的文件,先判断它们是否存在,存在就直接放过,不走任何重写逻辑。
-
RewriteCond %{REQUEST_FILENAME} -f:判断请求路径是否对应一个真实存在的普通文件 - 配合
RewriteRule ^ - [L]:表示“不改路径,且立即停止处理”
示例(放在所有重写规则之前):
RewriteCond %{REQUEST_FILENAME} -fRewriteRule ^ - [L]
按扩展名精准排除(不依赖文件是否存在)
如果想更主动地拦截某些后缀(比如禁止对 .log、.env 文件做任何响应),可直接用正则匹配请求路径,再用否定条件跳过:
-
RewriteCond %{REQUEST_URI} \.(log|env|bak|swp)$ [NC]:匹配以这些后缀结尾的请求([NC]忽略大小写) -
RewriteRule ^ - [F,L]:返回 403 Forbidden 并终止;或用[G,L]返回 410 Gone
若目标只是“不重写”,而非禁止访问,可改用:
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
RewriteRule ^ - [L]
组合使用:既放行真实静态文件,又拦截敏感后缀
实际部署中建议分两层控制:先拦掉危险后缀,再放行合法静态资源,最后才执行主路由逻辑。
# 拦截敏感后缀RewriteCond %{REQUEST_URI} \.(env|htaccess|log|sql|bak|sh|pl|py)$ [NC]
RewriteRule ^ - [F,L]
# 放行真实存在的静态文件(含图片、脚本、样式等)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# 放行真实存在的目录(如 /images/、/css/)
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# 其他请求统一入口(如 SPA 或 PHP 前端控制器)
RewriteRule ^(.*)$ /index.php [QSA,L]
注意点:路径匹配与大小写
REQUEST_URI 包含开头斜杠,所以 ^/.*\.log$ 才能匹配 /config.log;而 ^.*\.log$ 在部分上下文中可能失效。
推荐始终加 [NC],避免因 .JPG 或 .ENV 导致漏判。
不要只靠扩展名判断是否为“文件”:例如 /api/data.json 可能由 PHP 动态生成,此时 -f 不成立,需靠其他逻辑(如路径前缀)区分。










