通过Nginx反向代理为Tomcat上Jasper Reports配置CORS时预检请求失败
问题根因
你遇到的报错本质是三个核心问题叠加导致的:
- Tomcat返回的登录重定向地址跳过了Nginx反向代理:由于你配置了
proxy_redirect off,Jasper Server检测到未登录时返回的302跳转地址直接使用了Tomcat自身的服务地址192.168.21.18(无8081端口),该地址没有经过Nginx处理,自然不会携带CORS响应头。 - CORS配置存在语法冲突:你同时设置了
Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true,根据W3C规范,带身份凭证的请求不允许Origin配置为通配符*,浏览器会直接拦截该类响应。 - 缺失Host头传递:你没有给Tomcat传递Nginx的监听端口,Tomcat生成重定向地址时默认用自身的8080端口,进一步导致跳转地址错误。
修正后的Nginx配置
server { listen 8081; server_name _; access_log /var/log/nginx/tomcat-access.log; error_log /var/log/nginx/tomcat-error.log; # 动态取请求的Origin,适配带凭证的CORS请求 add_header 'Access-Control-Allow-Origin' $http_origin always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' $http_origin always; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } location / { # 传递Nginx的主机+端口给Tomcat,保证生成的重定向地址正确 proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 自动修正Tomcat返回的重定向地址,替换为Nginx的访问地址 proxy_redirect http://192.168.21.18:8080/ http://$host:$server_port/; proxy_pass http://192.168.21.18:8080/; } }
额外配置说明
- 修改完配置后执行
nginx -s reload重载配置生效。 - Angular端发送请求时需要开启
withCredentials: true,保证认证Cookie可以正常传递,避免Jasper Server反复跳转登录页。如果用的是Basic认证,直接在请求头携带Authorization字段也可以跳过登录跳转。 - 本地开发阶段也可以直接使用Angular自带的代理配置,不需要额外部署Nginx,在项目根目录新增
proxy.conf.json配置后用ng serve --proxy-config proxy.conf.json启动即可。
内容的提问来源于stack exchange,提问作者Steven John Lally
相关产品推荐
相关产品推荐

