filesmatch用于按文件名(含后缀)匹配并控制访问,必须置于directory或虚拟主机配置中;location则按url路径匹配,作用于请求逻辑层,二者分工明确、不可互换。

FilesMatch 和 Location 是 Apache 中两个关键但用途截然不同的配置容器:前者按文件名(或扩展名)匹配并施加控制,后者按 URL 路径匹配并干预请求处理流程。它们不互相替代,而是分工明确——一个管“磁盘上是什么文件”,一个管“浏览器访问的是什么地址”。
FilesMatch:精准限制特定文件的访问与行为
它用正则表达式匹配请求对象的基础文件名(不含路径),常用于禁止敏感文件被直接下载、关闭脚本执行、或统一设置响应头。
- 写法示例:
<filesmatch> Require all denied </filesmatch>—— 拒绝所有以 .php、.inc 等结尾的文件访问 - 可嵌套在
<directory></directory>内,缩小作用范围,比如只对/var/www/uploads/下的文件生效 - 支持出现在
.htaccess文件中,适合用户级细粒度控制 - 注意:它不关心请求是否真对应物理文件,只要 URL 解析出的最终文件名匹配就触发
Location:面向 URL 路径的逻辑层控制
<location></location> 匹配的是客户端发起的HTTP 请求路径(即浏览器地址栏里看到的部分),无论该路径背后是真实文件、重写后的虚拟路径,还是由模块(如 mod_status、mod_proxy)接管的接口。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 写法示例:
<location> Require ip 192.168.1.0/24 </location>—— 仅允许内网访问 /admin 路径 - 可配合
SetHandler将路径绑定到模块功能,例如<location> SetHandler server-status </location> - 不支持通配符路径(如
/api/*),需用<locationmatch></locationmatch>配合正则表达式 - 它在请求处理链中较晚生效,位于
<directory></directory>和<files></files>之后,因此可覆盖前者的某些设置
FilesMatch 与 Location 的典型协作场景
单独使用容易遗漏边界情况,组合起来才能覆盖完整需求:
- 想禁止上传目录下所有 PHP 文件执行,但又允许图片正常显示:先用
<directory></directory>关闭引擎,再用<filesmatch> Require all granted </filesmatch>显式放行图片 - 为 API 接口路径
/api/v1/users添加 CORS 头,但不想影响静态资源:用<location> Header set Access-Control-Allow-Origin "*"</location>,而静态文件走<filesmatch></filesmatch>或默认规则 - 防止
.git/config被泄露:既可在代码根目录用<files> Require all denied </files>,也可用<location> Require all denied </location>屏蔽整个路径前缀
注意事项与常见误区
理解它们的生效时机和匹配依据,能避免多数配置失效问题:
-
<filesmatch></filesmatch>匹配的是最终解析出的文件名,不是原始 URL;<location></location>匹配的是原始请求路径,不受内部重写影响(除非用<locationmatch></locationmatch>配合重写后变量) - 两者都支持正则,但
<filesmatch></filesmatch>更轻量,适合高频文件类型判断;<locationmatch></locationmatch>更灵活,适合 RESTful 路径或版本化接口管理 - 在 Apache 2.4+ 中,权限指令统一用
Require系列(如Require all denied),不再使用旧版Order/Deny/Allow - 修改后必须重启或重载 Apache(
systemctl reload httpd)才生效,.htaccess中的FilesMatch则实时读取(前提是AllowOverride All已启用)










