Flask-CORS未收到Origin请求头时返回随机Access-Control-Allow-Origin的问题
解决Flask-CORS无Origin请求返回错误响应头的问题
问题原因
你遇到的情况是Flask-CORS的默认行为导致的:当请求没有携带Origin头时,它会自动返回你配置的origins列表中的第一个值作为Access-Control-Allow-Origin响应头。但实际上,不带Origin的请求不属于跨域请求场景,根本不需要返回CORS相关的响应头,这个默认逻辑确实不符合预期。
正确配置方式
要解决这个问题,你需要自定义一个源验证回调函数,让Flask-CORS仅在请求携带Origin头且该源在允许列表内时,才返回对应的Access-Control-Allow-Origin头;否则不添加这个响应头。
具体代码实现
from flask import Flask from flask_cors import CORS app = Flask(__name__) # 预定义允许的源集合 ALLOWED_ORIGINS = {'http://localhost:3000', 'https://app.my_domain.com'} def validate_cors_origin(origin, request): # 只有当Origin存在且在允许列表中时,返回该Origin if origin in ALLOWED_ORIGINS: return origin # 无Origin或不在允许列表,返回None则不添加CORS响应头 return None # 配置CORS使用自定义的源验证回调 CORS(app, origins=validate_cors_origin)
效果验证
- 当请求携带
Origin: https://app.my_domain.com时,服务器会返回Access-Control-Allow-Origin: https://app.my_domain.com - 当请求携带未被允许的Origin时,不会返回CORS响应头(浏览器会拦截跨域请求)
- 当请求不带
Origin头时,服务器不会返回Access-Control-Allow-Origin头,符合正常的非跨域请求逻辑
内容的提问来源于stack exchange,提问作者Laugslander
相关产品推荐
相关产品推荐

