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/;

```

相关推荐
·薯条大王6 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
小小、码农9 小时前
Linux进程控制:从fork到exec,手写一个简易Shell
linux·运维·服务器
不会就选b9 小时前
Linux之进程间通信(二)---模拟进程池
linux·运维·服务器
沫璃染墨11 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
AIgorithmGEEK12 小时前
Linux 环境变量完全指南:从入门到理解底层原理
linux·运维·服务器
修罗王12 小时前
Linux Docker 服务管理与排查实战指南(新手速查版)
运维·docker
迪康Defender12 小时前
从静态存储到动态流转:终端透明加密两种模式实战解析
运维·服务器·网络·数据库·其他
酷可达拉斯13 小时前
Linux操作系统-升级OpenSSH修复漏洞
linux·运维·服务器·云计算
初禾w-w13 小时前
阿里云开源 UModel 并发起 USS 倡议:构建企业级通用语义标准,重塑 AI 交互底座
人工智能·阿里云·开源·企业ai·对象图语义·语义割裂
张龙68714 小时前
Docker 镜像瘦身实战:从 1.2GB 到 128MB,我踩过的 7 个坑和一套可复制的方法论
运维·后端·docker