一、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
这说明 allow 和 deny 已经生效。
六、为什么 /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 目录权限问题都会更容易理解。