注:本博客要说的不是location
的配置规则和内容,而是基于url
的nginx
代理转发的后端接口的路径配置。
实路径和虚路径?
location
配置路径时,是分实路径和虚路径的,并且路径会影响到proxy_pass
转发时的路径。
假如tomcat
启动了一个名为online-registration
的工程
登录的后端接口如下所示
@RestController
@RequestMapping("/user/login")
public class UserLoginController {
@RequestMapping()
public Object login() {
return "success";
}
}
nginx
的location
配置如下所示,自己测试时不要同时配置,避免混淆
# 虚路径
location /v1/online {
proxy_pass http://1.1.1.1:8080/online-registration/ ;
}
# 实路径
location /v1/online/user {
proxy_pass http://1.1.1.1:8080/online-registration/user ;
}
-
结合接口的
RequestMapping
和nginx
配置来看:接口的路径是
/user/login
,location
配置的/v1/online
为虚拟路径,它的proxy_pass
配置到tomcat
启动的工程名即可,/v1/online/user
路径中包含RequestMapping
的关键字,它的proxy_pass
路径需要配置到工程名下的具体接口的路径。 -
以浏览器访问虚路径分析:
location /v1/online { proxy_pass http://1.1.1.1:8080/online-registration/ ; }
访问
http://1.1.1.1/v1/online/user/login
,nginx
匹配url
中的/v1/online
时,nginx
会将online
后面的user/login
自动的添加到proxy_pass
转发的路径/online-registration/
后面,即nginx
转发的实际路径为:http://1.1.1.1:8080/online-registration/user/login
,正确的访问后端接口; -
以浏览器访问实路径分析:
location /v1/online/user { proxy_pass http://1.1.1.1:8080/online-registration/user ; }
访问
http://1.1.1.1/v1/online/user/login
,同虚路径的访问方式一致。但是如果proxy_pass
的配置是http://1.1.1.1:8080/online-registration;
,那么nginx
代理时,转发的实际路径为:http://1.1.1.1:8080/online-registration/login
,如果你的项目只有/user/login
接口,而没有/login
接口时,就会出现访问异常。