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类型的预检请求,确认:- 响应状态码是204,没有3xx跳转
- 响应头包含
Access-Control-Allow-Origin: * - 响应头包含
Access-Control-Allow-Methods: GET, POST, OPTIONS - 响应头的
Access-Control-Allow-Headers和请求携带的头匹配
修改完成后重启Nginx和Spring服务,清除浏览器缓存后重试即可。
内容的提问来源于stack exchange,提问作者Джейк Морган
相关产品推荐
相关产品推荐

