用 location ^~ 封禁敏感路径的核心目的是提前终止匹配流程,避免被后续正则规则(如 location ~ \.php$)覆盖;^~ 因匹配优先级最高、不参与正则匹配,能确保 /.git/、/.env 等固定前缀路径被精准拦截且防绕过。

用 location ^~ 封禁敏感路径(如 /.git、/.env)的核心目的,是让这些规则“提前终止匹配流程”,避免被后面定义的正则 location(比如 location ~ \.php$)意外覆盖或接管。
为什么必须用 ^~?——匹配顺序决定安全成败
Nginx 匹配 location 时,先处理所有普通 location(含 =、^~、无修饰符),从中选出最长前缀匹配;只有在没遇到 ^~ 且该前缀未“锁死”时,才会继续检查正则 location。一旦某条 ^~ 规则命中,Nginx 立即执行其块内指令,并跳过所有后续正则匹配。
-
^~不是正则,不支持通配,但胜在确定性强、执行优先级高 - 它比
~和~*更早介入,天然规避“被正则规则兜底”的风险 - 尤其适合封禁固定前缀路径,比如
/.git/、/.well-known/、/admin/等明确目录
封禁 /.git 目录的推荐写法
直接使用 ^~ 做前缀拦截,简洁且防绕过:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
location ^~ /.git/ {
deny all;
}
- 匹配所有以
/.git/开头的请求(如/.git/config、/.git/logs/HEAD) - 不匹配
/path/to/my.git这类文件名,避免误杀 - 若还想覆盖
/.git(不带尾斜杠)本身,可额外加一条:location = /.git { deny all; }
封禁 /.env 及常见变体的务实方案
^~ 无法处理后缀枚举(如 .env.local),所以对 .env 类文件,仍需正则。但关键在于:把正则规则放在 ^~ 块之后、所有 ~ \.php$ 之前,并确保它们足够精准:
# 先用 ^~ 锁住明确目录
location ^~ /.git/ { deny all; }
location ^~ /.well-known/ { allow all; } # 如需放行,显式声明
<h1>再用正则封禁 .env 变体(注意顺序!)</h1><p>location ~ /.env(.local|.example|.production|.backup)?\$ {
deny all;
}</p><h1>最后才是 PHP 处理块</h1><p>location ~ .php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}</p>
- 正则中的
\$是关键,防止/myenv.php被误拦 -
\.必须转义,否则.env中的点会匹配任意字符 - 所有安全正则必须出现在
~ \.php$之前,否则会被 PHP 规则抢先处理
通用隐藏路径兜底:谨慎使用 location ^~ /\.
如果想统一屏蔽所有以 /. 开头的路径(如 /.htaccess、/.svn),可用:
location ^~ /. {
deny all;
}
- 比
location ~ /\.更高效,不触发正则引擎 - 但会同时拦截
/.well-known/acme-challenge/,如有 Let’s Encrypt 需求,必须在其前显式放行 - 不建议替代专用规则(如单独封
/.git),而是作为补充防线










