Python配置Google Cloud函数allow-origin允许匹配的Netlify子域跨域
正确配置方案
原配置失效原因
标准CORS的Access-Control-Allow-Origin头原生不支持中间带通配符的域名格式,仅支持两种合法通配符用法:
- 单独使用
*允许所有来源(不推荐,安全性太低) - 通配符放在子域名最开头,比如
https://*.example.com
你写的https://*--domaincom.netlify.app属于中间带通配符的格式,浏览器和GCP云函数的CORS校验逻辑都不识别,因此配置不生效。
推荐解决方案:动态校验请求来源
不需要写死静态的ALLOW_ORIGIN列表,在云函数中每次请求先校验Origin请求头是否符合规则,匹配通过后再动态返回对应的Access-Control-Allow-Origin头即可,兼顾安全和灵活性。
代码示例如下:
import re from flask import request # 配置允许的固定域名和规则 ALLOWED_FIXED_ORIGINS = {"https://domain.com"} # 正则匹配Netlify预览环境域名,规则更严谨 NETLIFY_PREVIEW_PATTERN = r"^https://[a-zA-Z0-9]+--domaincom\.netlify\.app$" def your_cloud_function(request): # 处理预检OPTIONS请求 if request.method == "OPTIONS": headers = { "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Max-Age": "3600" } origin = request.headers.get("Origin") if origin: if origin in ALLOWED_FIXED_ORIGINS or re.match(NETLIFY_PREVIEW_PATTERN, origin): headers["Access-Control-Allow-Origin"] = origin return ("", 204, headers) # 处理普通业务请求 origin = request.headers.get("Origin") # 这里替换为你自己的业务逻辑返回 business_data = {"code": 0, "msg": "success"} headers = {} if origin: if origin in ALLOWED_FIXED_ORIGINS or re.match(NETLIFY_PREVIEW_PATTERN, origin): headers["Access-Control-Allow-Origin"] = origin return (business_data, 200, headers)
如果你不需要太严谨的校验,也可以直接用后缀判断简化逻辑:
ALLOWED_SUFFIX = "--domaincom.netlify.app" # 校验逻辑替换为 if origin.endswith(ALLOWED_SUFFIX): headers["Access-Control-Allow-Origin"] = origin
注意事项
不要为了省事直接配置ALLOW_ORIGIN = "*",会完全放开跨域限制,存在跨站请求伪造、数据泄露的安全风险。
内容的提问来源于stack exchange,提问作者MAZ
相关产品推荐
相关产品推荐

