你的配置分析
nginx
location /api/ {
proxy_pass http://localhost:8080/admin/;
}
注意:proxy_pass 最后有一个 斜杠 /,这会影响路径的转发方式。
二、路径转发规则
规则:如果 proxy_pass 以 / 结尾
-
原路径中的
/api/会被替换为/admin/ -
更准确地说:匹配到的部分(
/api/)会被整个删除 ,然后拼接上proxy_pass的路径
示例映射
| 前端请求 | Nginx 转发给后端 |
|---|---|
/api/employee/login |
http://localhost:8080/admin/employee/login |
/api/employee/list |
http://localhost:8080/admin/employee/list |
/api/order/detail |
http://localhost:8080/admin/order/detail |
三、你的后端接口应该怎么写
✅ 正确写法
java
@RestController
@RequestMapping("/admin/employee")
public class EmployeeController {
// 前端调用:/api/employee/login
// Nginx 转发:/admin/employee/login
// 最终匹配:@RequestMapping("/admin/employee") + @PostMapping("/login")
@PostMapping("/login")
public Result login(@RequestBody LoginDTO loginDTO) {
// 登录逻辑
return Result.success();
}
// 前端调用:/api/employee/list
// Nginx 转发:/admin/employee/list
@GetMapping("/list")
public Result list() {
return Result.success();
}
}
❌ 错误写法
java
// 错误:如果写成这样
@RequestMapping("/api/employee") // ❌ 后端没有 /api 路径
public class EmployeeController {
@PostMapping("/login")
public Result login() {
// 转发后是 /admin/employee/login,匹配不到 /api/employee/login
}
}
四、完整流程示例
场景:员工登录
- 前端代码
javascript
// 前端调用
axios.post('/api/employee/login', {
username: 'admin',
password: '123456'
})
- Nginx 转发
nginx
location /api/ {
proxy_pass http://localhost:8080/admin/;
}
实际转发给后端:http://localhost:8080/admin/employee/login
- 后端接口
java
@RestController
@RequestMapping("/admin/employee")
public class EmployeeController {
@PostMapping("/login")
public Result login(@RequestBody LoginDTO loginDTO) {
// 处理登录
// 访问路径:/admin/employee/login
return Result.success();
}
}
五、特殊情况:如果不以斜杠结尾
假设你的配置是:
nginx
location /api/ {
proxy_pass http://localhost:8080/admin; # 注意:没有最后的 /
}
那么转发规则会不同:
-
/api/employee/login→http://localhost:8080/adminemployee/login(注意:/admin和employee直接拼接,缺少斜杠) -
这通常不是你想要的效果,所以建议保持配置以
/结尾。
六、总结
你的理解:
-
✅
@RequestMapping("/admin/employee")是正确的 -
✅ 前端调用
/api/employee/login也是正确的 -
✅ 后端写
/login接口匹配也是正确的
核心要点:
-
前端路径中的
/api/会被 Nginx 替换成/admin/ -
后端接口路径中不要出现
/api/,应该用/admin/ -
你的
@RequestMapping("/admin/employee")正好匹配转换后的路径
这样配置的好处是:前端不需要知道后端的具体路径前缀(/admin),只需要统一调用 /api/xxx,Nginx 负责做路径映射。