locationmatch是apache支持正则表达式的路径匹配容器指令,用于对url路径(不含域名和查询参数)执行访问控制、代理、头设置等操作,适用于路径级路由场景,如/api/代理、/admin/权限限制、/static/静态映射等,但不能替代基于ip/域名的virtualhost。

Apache 中没有基于路径的“虚拟主机”概念,VirtualHost 指令本身只支持基于 IP、端口或域名(Host 头)的区分,不识别 URL 路径。但你可以用 LocationMatch(或更常用、更直接的 Alias 和 Location)来实现“同一域名下按路径分发到不同内容或服务”的效果——这常被误称为“基于路径的虚拟主机”,实际是路径级路由控制。
LocationMatch 是什么?适用场景在哪?
LocationMatch 是 Apache 的容器指令,用于匹配请求 URL 路径(不包含域名和查询参数),支持正则表达式。它不能替代 VirtualHost,但适合做以下事情:
- 对特定路径启用/禁用功能(如强制 HTTPS、限制访问、开启 CGI)
- 为某类路径设置不同响应头或重写规则
- 将 /api/、/admin/、/static/ 等路径代理到后端服务或映射到不同目录
- 配合 mod_rewrite 或 mod_proxy 实现路径级路由
注意:它不改变 DocumentRoot,也不创建独立站点;只是在请求到达主文档根目录前,对匹配路径做额外处理。
用 LocationMatch 实现路径分发(示例)
假设你希望:
- 访问
http://localhost/→ 显示主站(/var/www/html) - 访问
http://localhost/api/→ 代理到本地 8080 端口的服务 - 访问
http://localhost/docs/→ 显示 /var/www/docs 下的静态文件
可在虚拟主机配置中添加:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName localhost
DocumentRoot "/var/www/html"
<locationmatch>
ProxyPass "http://127.0.0.1:8080/"
ProxyPassReverse "http://127.0.0.1:8080/"
</locationmatch><location>
Alias "/docs/" "/var/www/docs/"
<directory>
Require all granted
</directory></location></virtualhost>
说明:
-
LocationMatch "^/api/"使用正则匹配所有以 /api/ 开头的路径 -
ProxyPass需要启用mod_proxy和mod_proxy_http -
Alias更推荐用于静态路径映射,比 Location + Directory 组合更清晰高效
更实用的替代方案:Alias + Directory
对固定路径映射,Alias 指令比 LocationMatch 更简洁、性能更好:
-
Alias /blog "/var/www/blog"→ 访问 /blog/xxx 就读取 /var/www/blog/xxx - 必须配合
<directory> Require all granted </directory>开放权限 - 不依赖正则,无匹配开销,Apache 优先级高于 DocumentRoot 查找
例如,让 /static/ 指向 CDN 风格资源目录:
<virtualhost>
DocumentRoot "/var/www/site"
Alias "/static" "/var/www/assets"
<directory>
Require all granted
Options -Indexes
</directory></virtualhost>
注意事项与常见错误
使用 LocationMatch 或路径映射时容易踩坑:
- 路径开头的斜杠必须一致:Location "/api" 不匹配 /api/xxx,应写 "/api/" 或用 LocationMatch
- Alias 后的路径必须以 / 结尾(除非映射单个文件),否则可能产生路径拼接错误
- 权限未开放会导致 403 Forbidden ——
Require all granted必须出现在对应 Directory 块中 - 修改配置后需运行
apachectl configtest检查语法,再systemctl reload apache2(或httpd -k graceful)生效 - 浏览器缓存可能掩盖配置变化,建议用 curl 测试:
curl -I http://localhost/api/health










