你的配置分析
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 负责做路径映射。