配置nginx反向代理后Spring Boot的PUT和DELETE请求返回403是什么原因
Spring Boot 部署在 Nginx 反向代理后 PUT/DELETE 请求返回 403 的原因及解决方案
可能原因及对应解决方法
- 原因1:Spring Security 默认开启的 CSRF 防护拦截
若项目引入了 Spring Security 依赖,默认会自动开启 CSRF 防护,该机制会直接拦截 GET、HEAD、TRACE、OPTIONS 之外的所有请求,PUT、DELETE 属于拦截范围,会返回 403。
解决方法:前后端分离的纯 REST 接口场景下,若没有使用 Cookie 做身份鉴权,可以直接关闭 CSRF 防护,配置示例如下:@Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // 关闭CSRF防护 http.csrf().disable(); // 此处保留你原有其他鉴权逻辑配置 return http.build(); } } - 原因2:Nginx 配置缺失必要的请求头透传
你当前的 Nginx 配置仅配置了基础的反向代理规则,没有透传原始请求的方法、域名、协议等信息,部分应用的安全策略会因为无法识别请求的合法性,拦截 PUT、DELETE 这类非普通请求。
解决方法:修改 Nginx 站点配置的 location 块,补充透传配置:
修改完成后执行location / { proxy_pass http://localhost:8082/; proxy_buffering off; # 透传原始请求方法 proxy_method $request_method; # 透传原始请求头信息 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; }nginx -s reload重载 Nginx 配置即可生效。 - 原因3:跨域(CORS)配置限制了请求方法
若你在 Spring Boot 中配置了跨域规则,只放开了 GET、POST 请求,OPTIONS 预检请求检测到 PUT/DELETE 不在允许范围内时,也会返回 403 错误。
解决方法:在跨域配置中添加 PUT、DELETE 等需要的请求方法,示例如下:// 接口注解方式配置 @CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}) - 原因4:Nginx 全局/站点配置存在请求方法限制
检查 Nginx 的全局配置、当前站点的其他配置片段,是否存在limit_except规则,仅允许 GET、POST 请求,限制了其他请求方法的访问。如果存在相关规则,删除对应限制即可。
内容的提问来源于stack exchange,提问作者geschema
相关产品推荐
相关产品推荐

