You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring+Nginx环境下preflight请求重定向导致CORS拦截问题如何解决?

问题根因定位

报错核心是预检OPTIONS请求触发了3xx跳转,浏览器的CORS规则不允许预检请求被重定向,直接拦截了请求,和你配置的CORS头是否正确没有直接关系。

排查修复步骤
  • 第一步:修正前端请求地址
    你当前前端请求的是http://localhost:8080/api/auth/signup,但前端页面部署在https://mysuite.ru,且已经配置了Nginx做443端口的反向代理,正确的请求地址应该是https://mysuite.ru/api/auth/signup,不要直接请求8080端口的后端地址,请求地址写错会直接触发跨域,甚至导致后端因为请求头不匹配返回重定向。
  • 第二步:放行Spring Security的OPTIONS请求
    默认Spring Security会拦截OPTIONS请求,需要显式配置允许所有OPTIONS请求无需认证:
http.cors().and()
    .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
    .authorizeRequests()
    // 新增这行,放行所有OPTIONS请求
    .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
    .antMatchers("/admin").hasRole("ADMIN")
    .antMatchers("/").permitAll()
    .antMatchers("/favicon.ico").permitAll()
    .antMatchers("/static/**").permitAll()
    .antMatchers("/manifest.json").permitAll()
    .antMatchers("/logo192.png").permitAll()
    .antMatchers("/api/auth/**").permitAll()
    .antMatchers("/api/test/**").permitAll()
    .anyRequest().authenticated();
  • 第三步:移除重复的CORS配置
    你同时在Nginx、Spring Controller、Spring Security三处配置了CORS,会导致CORS头重复返回,反而触发浏览器拦截。只保留一处配置即可,推荐保留Nginx的CORS配置,删除Controller上的@CrossOrigin注解,避免头重复冲突。
  • 第四步:排查Nginx重定向逻辑
    检查你的Nginx全局配置、其他server块配置,是否存在http跳https、路径末尾自动补斜杠的301/302重定向逻辑,这类逻辑会触发预检请求跳转。如果有路径补斜杠的逻辑,需要把OPTIONS请求排除在重定向规则之外。
  • 第五步:验证预检请求响应
    修改完成后,打开浏览器控制台的网络页,找到OPTIONS类型的预检请求,确认:
    1. 响应状态码是204,没有3xx跳转
    2. 响应头包含Access-Control-Allow-Origin: *
    3. 响应头包含Access-Control-Allow-Methods: GET, POST, OPTIONS
    4. 响应头的Access-Control-Allow-Headers和请求携带的头匹配

修改完成后重启Nginx和Spring服务,清除浏览器缓存后重试即可。

内容的提问来源于stack exchange,提问作者Джейк Морган

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:54:04