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

如何解决重定向预检请求中浏览器将ORIGIN头设为null的问题?

解决跨域重定向时Chrome发送Origin: null导致的CORS失败问题

问题背景

两个FastAPI站点分别部署在app.mydomain.com和login.mydomain.com,通过交互完成用户认证:从app.mydomain.com加载的React页面向login.mydomain.com发起请求,后者重定向回app.mydomain.com触发CORS预检。但Chrome 131.0+出于隐私保护,会将该预检请求的Origin头替换为null,而非预期的域名,导致app.mydomain.com响应异常(用Starlette CORSMiddleware返回400,用Nginx Ingress的enable-cors注解返回405),登录流程中断。

解决方案:显式允许"null"源

由于Chrome的这个行为无法规避,唯一可行方案是在app.mydomain.com的CORS配置中添加"null"作为允许的源,以下是两种部署方式的具体配置:

1. Starlette CORSMiddleware配置修改

直接在FastAPI的CORSMiddleware参数中,将"null"加入allow_origins列表,同时确保allow_credentials开启(如果需要携带Cookie):

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://app.mydomain.com", "https://login.mydomain.com", "null"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

注意:如果你的场景中不需要允许所有方法/头,可以根据实际需求缩小范围,但预检请求通常需要允许OPTIONS方法和常见头。

2. K8s Nginx Ingress配置修改

默认的enable-cors注解不支持null源,需要通过自定义配置片段来处理:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($http_origin = "null") {
          add_header Access-Control-Allow-Origin "null";
          add_header Access-Control-Allow-Credentials "true";
      }
      if ($http_origin ~* "^https://(app|login)\.mydomain\.com$") {
          add_header Access-Control-Allow-Origin "$http_origin";
          add_header Access-Control-Allow-Credentials "true";
      }
      if ($request_method = OPTIONS) {
          add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
          add_header Access-Control-Allow-Headers "Content-Type, Authorization";
          add_header Access-Control-Max-Age "86400";
          return 204;
      }
spec:
  rules:
  - host: app.mydomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80

这段配置做了三件事:

  • 匹配Origin: null的请求,返回对应的允许头
  • 匹配正常的两个域名请求,返回对应Origin的允许头
  • 直接处理OPTIONS预检请求,返回204,避免转发到后端FastAPI导致405错误

原理说明

Chrome在跨域重定向场景下会将Origin设为null是浏览器的隐私保护机制,目的是防止敏感信息泄露。只有显式将null加入CORS允许列表,才能让浏览器认可该预检请求的合法性,进而完成后续的登录握手流程。

内容的提问来源于stack exchange,提问作者guydo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:05:03