多看网页开发者工具,多按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; } ``` ---操作步骤(宝塔面板)
进入宝塔面板 → 网站 → 找到`116.62.85.110` → 点击**设置**
点击左侧**配置文件**
全选原来的所有内容,替换成上面我给你的配置
点击**保存**
点击左侧**服务** → 点击**重启**按钮重启Nginx
验证是否成功
清空浏览器缓存(Ctrl+Shift+R强制刷新)
打开F12 → Network
刷新页面,看验证码接口(一般是`/gkpro/prod-api/captchaImage`)
- 如果返回200,并且能看到验证码图片,说明配置成功
- 尝试登录,看`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。
额外检查(如果还是不行)
- 确认后端服务确实在8081端口运行:
```bash
netstat -tulpn | grep 8081
```
应该能看到java进程在监听8081端口
- 确认后端接口路径是`/login`而不是`/prod-api/login`:
因为我们配置的是`proxy_pass http://localhost:8081/;\`,所以\`/gkpro/prod-api/login\`会被转发到\`http://localhost:8081/login\`
- 如果后端接口本身就是`/prod-api/login`,把proxy_pass改成:
```nginx
proxy_pass http://localhost:8081/prod-api/;
```