一、location 到底是做什么的

原笔记给出的核心定义是:

  • location 用于匹配用户请求中的 URI
  • 如果用户请求的 URI 是某种形式,就按对应规则处理

很多资料也会把它理解成 Nginx 的“路由规则”。

原笔记还专门区分了 URL 和 URI:

URL: http://www.baidu.com/lidao/lidao.avi
URI: /lidao/lidao.avi

也就是说,location 关注的不是完整网址,而是域名后面的那一段路径。

二、案例目标:搭建购物网站并限制后台访问

原笔记设计的案例是一个大型直播购物网站:

  • 域名:buy.oldboylinux.cn
  • 站点目录:/app/code/buy/
  • 后台目录:/app/code/buy/admin/index.html
  • 要求后台只能让 172.16.1.0/24 网段访问

这个案例很适合展示:

  • 普通首页如何走默认 location /
  • 后台目录如何走更具体的 location /admin/

三、站点配置该怎么写

原笔记给出的配置如下:

server {
    listen       80;
    server_name  buy.oldboylinux.cn;
    root   /app/code/buy;
    location / {
        index  index.html;
    }
    location /admin/ {
        allow 172.16.1.0/24;
        deny all;
        index  index.html;
    }
}

这里最关键的是后台规则:

  • allow 172.16.1.0/24;
  • deny all;

它表达的意思是:只有内网网段被允许,其余来源全部拒绝。

四、配套目录和页面如何准备

原笔记的准备步骤如下:

mkdir -p /app/code/buy/admin
echo buy.oldboylinux.cn >/app/code/buy/index.html
echo admin.buy.oldboylinux.cn >/app/code/buy/admin/index.html
nginx -t
systemctl reload nginx

这样首页和后台首页都具备了最基本的测试内容。

五、不同访问方式为什么结果不同

原笔记给出了三组典型测试结果。

5.1 访问首页

curl -H Host:buy.oldboylinux.cn http://192.168.1.20

返回:

buy.oldboylinux.cn

因为首页命中了 location /,且不受后台访问控制影响。

5.2 从非允许网段访问 /admin/

curl -H Host:buy.oldboylinux.cn http://192.168.1.20/admin/

返回 403 Forbidden
原因是请求进入了 location /admin/,但来源地址不在允许网段内。

5.3 从允许网段访问 /admin/

curl -H Host:buy.oldboylinux.cn http://172.16.1.20/admin/

返回:

admin.buy.oldboylinux.cn

这说明 allowdeny 已经生效。

六、为什么 /admin//admin 不一样

原笔记特别强调了这个容易踩坑的细节:

  • location /admin/ 匹配的是以 /admin/ 开头的路径
  • 如果请求 URI 是 /admin
  • 它并不等同于 /admin/

因此直接访问:

curl -H Host:buy.oldboylinux.cn http://172.16.1.20/admin

会先看到:

301 Moved Permanently

这是因为 Nginx 需要把目录访问规范化到带斜杠的路径。

原笔记后面通过两步让测试更顺畅:

1、在 /etc/hosts 中添加:

172.16.1.20 buy.oldboylinux.cn

2、使用 curl -L 跟随重定向:

curl -L -H Host:buy.oldboylinux.cn http://172.16.1.20/admin

这样就能成功看到后台页面内容。

七、该如何理解 location /admin/ 的匹配范围

原笔记这一节想说明的重点其实是:

  • location /admin/ 针对的是特定前缀路径
  • 命中的关键是 URI 前缀是否与规则一致

在实际排查中,如果发现同一个目录:

  • 带斜杠能访问
  • 不带斜杠发生跳转

通常就要优先想到这是目录型 URI 的规范化行为。

八、小结

location 的第一层价值,就是让不同 URI 走不同处理规则。
这个购物网站案例正好展示了两个典型用法:

  • location / 负责普通站点首页
  • location /admin/ 负责更细粒度的后台路径控制

只要把 URI、前缀匹配和访问控制这三点连起来,很多 Nginx 目录权限问题都会更容易理解。