Nginx 配置顺序错误

多看网页开发者工具,多按F12看调试

问题描述

前端能显示出来,但是验证码加载不出来,后端这xshell里也成功运行了jar包

ngix配置如下: server { listen 80; server_name 116.62.85.110; index index.html index.htm; root /www/wwwroot/dist; include /www/server/panel/vhost/nginx/extension/116.62.85.110/*.conf; # --- 核心修改:专门处理 /gkpro/ 的请求 --- # 使用 ^~ 符号告诉 Nginx:如果匹配到这个前缀,就不要再去匹配下面的正则了 location ^~ /gkpro/ { alias /www/wwwroot/dist/; # 尝试找文件,找不到就找 index.html(为了支持前端路由) try_files uri uri/ /index.html; } # API 代理 location /prod-api { proxy_pass http://localhost:8081/; proxy_set_header Host host; proxy_set_header X-Real-IP remote_addr; proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for; } # 根目录处理(防止直接访问 IP 时报错) location / { try_files uri uri/ /index.html; } # --- 静态资源缓存配置 --- # 注意:由于上面的 \^\~ /gkpro/ 优先级更高,这里的规则不会拦截 /gkpro/ 的请求 location \~ .\*\\.(js\|css)? { expires 12h; try_files uri =404; access_log /dev/null; } location \~ .\*\\.(gif\|jpg\|jpeg\|png\|bmp\|swf) { expires 30d; try_files $uri =404; access_log /dev/null; } # 禁止访问敏感目录 location ~* /(\.git|\.svn|\.env|node_modules)/ { return 404; } access_log /www/wwwlogs/116.62.85.110.log; error_log /www/wwwlogs/116.62.85.110.error.log; }

前端能显示出来,但是验证码加载不出来,后端这xshell里也成功运行了jar包

解决

java 复制代码
# 问题根源找到了!100%是Nginx配置顺序错误
你的**API代理完全没生效**!所有`/gkpro/prod-api/`的请求都被前面的`location ^~ /gkpro/`拦截了,Nginx把POST请求当成了静态文件请求,所以返回405。

---

# 直接替换成这个完整的Nginx配置
```nginx
server {
    listen 80;
    server_name 116.62.85.110;
    index index.html index.htm;
    root /www/wwwroot/dist;
    include /www/server/panel/vhost/nginx/extension/116.62.85.110/*.conf;

    # ✅ 第一步:先匹配API请求(优先级最高)
    # 专门处理 /gkpro/prod-api/ 的请求,转发到后端8081端口
    location ^~ /gkpro/prod-api/ {
        proxy_pass http://localhost:8081/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # ✅ 第二步:再处理前端静态资源和路由
    location ^~ /gkpro/ {
        alias /www/wwwroot/dist/;
        try_files $uri $uri/ /index.html;
    }

    # 根目录处理(防止直接访问IP时报错)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # --- 静态资源缓存配置 ---
    location ~ .*\.(js|css)?$ {
        expires      12h;
        try_files $uri =404;
        access_log /dev/null;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
        expires      30d;
        try_files $uri =404;
        access_log /dev/null;
    }

    # 禁止访问敏感目录
    location ~* /(\.git|\.svn|\.env|node_modules)/ {
        return 404;
    }

    access_log  /www/wwwlogs/116.62.85.110.log;
    error_log  /www/wwwlogs/116.62.85.110.error.log;
}
```

---

操作步骤(宝塔面板)

  1. 进入宝塔面板 → 网站 → 找到`116.62.85.110` → 点击**设置**

  2. 点击左侧**配置文件**

  3. 全选原来的所有内容,替换成上面我给你的配置

  4. 点击**保存**

  5. 点击左侧**服务** → 点击**重启**按钮重启Nginx


验证是否成功

  1. 清空浏览器缓存(Ctrl+Shift+R强制刷新)

  2. 打开F12 → Network

  3. 刷新页面,看验证码接口(一般是`/gkpro/prod-api/captchaImage`)

  • 如果返回200,并且能看到验证码图片,说明配置成功
  1. 尝试登录,看`login`接口
  • 如果返回200或者401(用户名密码错误),说明接口通了

  • 如果还是405,检查后端服务是否真的在8081端口运行


为什么原来的配置错了?

Nginx的location匹配优先级:

`^~ 前缀匹配` > `正则匹配` > `普通前缀匹配`

你原来的配置:

```nginx

优先级高

location ^~ /gkpro/ {

处理静态文件

}

优先级低

location /prod-api {

永远不会被匹配到!

}

```

当请求`/gkpro/prod-api/login`时,会先匹配到`^~ /gkpro/`,Nginx会尝试在静态文件目录找`prod-api/login`这个文件,找不到就返回`index.html`。但前端发的是POST请求,Nginx默认不允许POST请求访问静态文件,所以返回405。


额外检查(如果还是不行)

  1. 确认后端服务确实在8081端口运行:

```bash

netstat -tulpn | grep 8081

```

应该能看到java进程在监听8081端口

  1. 确认后端接口路径是`/login`而不是`/prod-api/login`:

因为我们配置的是`proxy_pass http://localhost:8081/;\`,所以\`/gkpro/prod-api/login\`会被转发到\`http://localhost:8081/login\`

  1. 如果后端接口本身就是`/prod-api/login`,把proxy_pass改成:

```nginx

proxy_pass http://localhost:8081/prod-api/;

```

相关推荐
Avan_菜菜4 分钟前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
ping某4 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理