location ~* ^/admin/(.*)这种匹配https://www.sweet.com/ntpii/admin/login?吗
什么情况下上面可以,因为环境是正常的,
哦,好像看到了,这个location上面有个#rewrite hardware load balance proxy
location /ntpii/ {
rewrite /ntpii/(.*) /$1 last;
}
在 Nginx 的 location 里:
~* 是什么意思?
• ~:表示正则匹配
• *:表示不区分大小写
合起来:
~* = 不区分大小写的正则匹配
不匹配。
原因很简单:
• 你的正则:location ~* ^/admin/(.*)
要求 URL 路径必须以 /admin/ 开头
• 你给的地址:https://www.sweet.com/ntpii/admin/login
路径是 /ntpii/admin/login,是以 /ntpii/ 开头的
想要能匹配:
最常见:Nginx 做了 rewrite / 重写路径
rewrite ^/ntpii/(.*)$ /$1 break;
或者
rewrite ^/ntpii/admin/(.*)$ /admin/$1 last;
结果:
请求进来是 /ntpii/admin/login
重写后变成 /admin/login
于是你的 ^/admin/ 就匹配上了。
还有一点不懂,在同一个nginx配置里,一次请求:匹配完nginx规则,还能再匹配
一次请求,Nginx 可以重新匹配多次 location。
关键就在你看到的那个词:last
一句话原理
rewrite ... last;
意思是:
改完 URL 后,立刻重新从头匹配一遍所有 location,就像刚进来一个新请求一样。
你的请求到底走了几遍?
访问:/ntpii/admin/login
第一遍匹配
1. 路径:/ntpii/admin/login
2. 命中:location /ntpii/
3. 执行:rewrite /ntpii/(.*) /$1 last;
路径变成:/admin/login
4. 看到 last
→ 扔掉当前匹配,重新全局匹配一次
第二遍匹配
1. 路径已经是:/admin/login
2. 从头找所有 location
3. 命中:location ~* ^/admin/(.*)
4. 正常执行里面的 proxy_pass / 逻辑
所以:
你看到是一个请求,实际上 Nginx 内部走了两轮 location 匹配。
所以:
你看到是一个请求,实际上 Nginx 内部走了两轮 location 匹配。
比一下你就懂
• rewrite ... break;
→ 改完路径,不再重新匹配,就在当前 location 执行完
• rewrite ... last;
→ 改完路径,重新全局匹配 location(你现在就是这种)