假如接口地址是
https://bizapi.csdn.net/blog-console-api/v1/article/getQueryCriteriaNew
那么 nginx 的 server_name 匹配的就是 bizapi.csdn.net ,就算这个 bizapi.csdn.net 域名被dns服务器解析成实际的ip地址如123.12.212.11,它的请求头的host字段依然是 bizapi.csdn.net。到达nginx后依然匹配server_name = bizapi.csdn.net
网上的入门信息都很垃圾,看得让人头疼,好好的入门教程写的什么鬼玩意,我重新整理了一遍。
首先假设后端的接口ip为
192.168.184.20:8080
那么我们需要在本地起一个nginx去反向代理到后端,最关键的部分来了,看如下代码
假如我们电脑的ip是
192.168.184.240
我们来修改 nginx.config
// back_end 随便写,但是等下要用到
upstream back_end {
// 后端服务器地址
server 192.168.184.20:8080
}
// server就是在本地起一个http服务器
server {
// 这个服务器的端口是80
listen 80;
// 定义这个服务器的域名是 proxy.kutian.edn
server_name proxy.kutian.edn;
// 当用户请求 http://proxy.kutian.edn/proxy 会走这里
location /proxy {
// 这个 back_end 会匹配我们上面的 upstream,实际上发出请求是http://192.168.184.20:8080/proxy
proxy_pass http://back_end/proxy
}
// 当用户请求 http://proxy.kutian.edn/xxxx 会走这里
location /xxxx {
proxy_pass http://back_end/yyy
}
// 当用户请求 http://proxy.kutian.edn 会走这里
location / {
proxy_pass http://back_end
}
}
这样我们就起了一台域名为 http://proxy.kutian.edn 服务器,这时候你会直接在前端这样写
axios('http://proxy.kutian.edn')
你以为能够直接访问到后端的 192.168.184.20:8080
但是却很遗憾的说不行,因为你以为server_name就是起一个域名为
http://proxy.kutian.edn 的服务器所以直接访问 http://proxy.kutian.edn
就行了,其实不是。我们本地ip是什么,这里是 192.168.184.240:80
就是以 192.168.184.240:80 起一个服务器,名字叫 http://proxy.kutian.edn 而已。
所以我们还需要在host文件写上
192.168.184.240 proxy.kutian.edn
这里又引入一个问题,你可能又会以为那我请求的是 http://proxy.kutian.edn:80 ,我们的host文件将这个url域名改成 http://192.168.184.240:80 ,那么发出请求的是 http://192.168.184.240:80 ,那nginx服务器又怎么知道匹配的是那个 server 呢,现在只有一个server(就是nginx.conf的server {}),是有很多个server(你可以自行添加)但是每个server 的server_name
不一样。其实,我们在浏览器发出的每一个请求请求头都会有一个host字段(随便找个网站打开network就能看到),host文件只是把请求的url改了而已,但是请求头和请求体的内容不会发生改变,当请求经过host文件,到达nginx的时候,nginx会从请求的请求头上获取host字段来对比当前的server_name,如果一致就执行当前这个server。
分割线 ===================================
server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。
修改nginx.conf
server {
listen 80;
server_name www;
location / {
default_type text/html;
content_by_lua '
ngx.say("first
")
';
}
}
server {
listen 80;
server_name www.zkh.com;
location / {
default_type text/html;
content_by_lua '
ngx.say("second
")
';
}
}
server {
listen 80;
server_name www.zkh.*;
location / {
default_type text/html;
content_by_lua '
ngx.say("third
")
';
}
}
server {
listen 80;
server_name ~\w+.com;
location / {
default_type text/html;
content_by_lua '
ngx.say("forth
")
';
}
}
server {
listen 80;
server_name ~.*zkh.com;
location / {
default_type text/html;
content_by_lua '
ngx.say("fifth
")
';
}
}
修改hosts文件
118.126.100.138 www.zkh.com
118.126.100.138 www.zkh.org
118.126.100.138 zkh.com
118.126.100.138 zkh.org
通过network查看请求头,发现请求头携带了Host,由此可知nginx必定会拿它做uri匹配工作
自己随便找个网站打开看下就行了,我就不截图了