From 5f3fd38bb10d3f7823464c556ebbdd4842157b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=BB=E5=8B=87=E7=A5=A5?= <237899745@qq.com> Date: Fri, 21 Nov 2025 16:49:38 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8DNginx=20Cookie?= =?UTF-8?q?=E4=BC=A0=E9=80=92=E9=97=AE=E9=A2=98=20-=20=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81Session=E5=85=B3=E9=94=AE=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题根源(终于找到了!) Nginx反向代理默认不会正确传递Cookie,导致: 1. 后端设置的 Set-Cookie 响应头被Nginx丢弃 2. 前端发送的 Cookie 请求头无法到达后端 3. 验证码session完全无法工作 ## 症状 - 验证码一直提示"已过期" - 即使前端配置了 withCredentials: true 也无效 - 浏览器看不到 captcha.sid cookie ## 修复方案 在 nginx.conf 的 /api/ location 块中添加: ```nginx # Cookie传递配置(验证码session需要) proxy_set_header Cookie $http_cookie; proxy_pass_header Set-Cookie; ``` ### 配置说明 1. `proxy_set_header Cookie $http_cookie;` - 将浏览器发送的Cookie转发给后端 - 后端可以读取验证码session 2. `proxy_pass_header Set-Cookie;` - 将后端的Set-Cookie响应头传递给浏览器 - 浏览器可以保存验证码session cookie ## 完整的验证码工作流程 1. **验证码生成**: ``` 浏览器 → Nginx → 后端生成验证码和session 后端 → Set-Cookie: captcha.sid=xxx → Nginx → 浏览器保存 ``` 2. **验证码验证**: ``` 浏览器(带Cookie) → Nginx → 后端读取session验证 ``` ## 部署说明 ### Docker环境 ```bash docker-compose down docker-compose up -d ``` ### 手动Nginx ```bash nginx -t # 测试配置 nginx -s reload # 重新加载 ``` ## 验证方法 1. 清除浏览器Cookie 2. F12 → Network → 清除日志 3. 访问登录页,输错密码2次 4. 查看 /api/captcha 响应头应该有 Set-Cookie 5. 查看 /api/login 请求头应该有 Cookie: captcha.sid=xxx 6. 输入验证码应该能正常通过 ## 相关提交 此修复配合以下提交才能完整工作: - 后端session配置修复 (7ce9d95) - 前端axios withCredentials配置 (83773ef) - Nginx Cookie传递配置 (本提交) 三个修复缺一不可! 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- nginx/nginx.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 9208223..2fe78f7 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -45,6 +45,10 @@ server { proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; + # Cookie传递配置(验证码session需要) + proxy_set_header Cookie $http_cookie; + proxy_pass_header Set-Cookie; + # 增加超时时间支持大文件上传 proxy_connect_timeout 300; proxy_send_timeout 300;