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

```

相关推荐
木雷坞2 小时前
2026年4月实测:K8s containerd 镜像拉取全方案汇总
运维·容器·kubernetes
℡終嚸♂6802 小时前
Vite 开发服务器文件读取 Writeup
运维·服务器·状态模式
开开心心_Every2 小时前
动图制作工具,拆分转视频动态照离线免费
运维·前端·人工智能·edge·pdf·散列表·启发式算法
薛定猫AI3 小时前
【技术干货】OpenAI Codex 重大更新:从代码补全工具到全流程智能开发平台
运维·人工智能
曦云沐3 小时前
Linux 下极简安装 Conda(Miniconda / Anaconda),5 分钟搞定环境配置
linux·运维·conda
key_3_feng3 小时前
基于OpenClaw的Alibaba Cloud Linux 3自动化部署YashanDB深度方案
linux·运维·自动化·yashandb
zzzsde3 小时前
【Linux】进程信号(2)保存信号与信号处理
linux·运维·服务器·算法
代码飞天3 小时前
CTF之文件上传——你知道我在你的服务器上放了什么吗
运维·服务器
小此方4 小时前
Re:Linux系统篇(一)从浅谈操作系统历史背景到安装部署云服务器
linux·运维·服务器