文生图接口总被跨域拦截,因其请求含authorization、application/json或base64二进制数据等非简单请求特征,必触发options预检;若php未在最顶部显式响应204并退出,或cors头缺失/冲突/被覆盖,浏览器即拦截后续请求。

直接加 header() 不够,文生图这类接口通常带 Authorization、Content-Type: application/json,还会发 PUT 或 POST 带二进制数据(如 base64 图片),浏览器必然触发预检(OPTIONS),漏掉它就永远卡在 404/500 或 “preflight request doesn’t pass access control check”。
为什么文生图接口总被跨域拦截
文生图请求几乎全是“非简单请求”:含 Authorization 头、Content-Type 是 application/json 或 multipart/form-data、body 里传大段 base64、甚至用 PUT 提交任务。这些都会让浏览器自动先发 OPTIONS 探路。PHP 默认不响应 OPTIONS,前端就收不到任何实际响应——控制台 Network 标签里只看到一个失败的 OPTIONS,后面真正的 POST 根本没发出。
- 常见错误现象:
Response to preflight request doesn't pass access control check、No 'Access-Control-Allow-Origin' header is present、Chrome Network 中OPTIONS显示 404 或 pending - 不是 CORS 头没加,而是加得太晚——
header()被 echo、HTML、BOM 或输出缓冲拦在了后面 - 如果前端用了
fetch(..., { credentials: 'include' })或要传 Cookie,Access-Control-Allow-Origin就不能是*,否则浏览器直接丢弃响应
必须在所有输出前设置的 CORS 头组合
文生图接口需要比普通 API 更严格的头声明,尤其要覆盖图像上传场景。以下代码必须放在 PHP 文件最顶部(连空行都不能有),且在任何 echo、print、require、HTML 输出之前:
header('Access-Control-Allow-Origin: https://your-frontend.com');
header('Access-Control-Allow-Methods: POST, OPTIONS, GET');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, X-File-Name');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
header('Vary: Origin');
-
Access-Control-Allow-Headers里加了X-File-Name——很多前端 SDK 上传图片时会带这个自定义头,漏掉就会预检失败 -
Access-Control-Allow-Methods明确列出POST和OPTIONS,文生图基本不用PUT/DELETE,别堆一堆没用的方法 -
Vary: Origin必加,否则 CDN 或代理可能缓存错响应(比如把https://a.com的响应返回给https://b.com) - 不要用
Access-Control-Allow-Origin: *配合Access-Control-Allow-Credentials: true,PHP 会静默忽略后者,前端仍拿不到 Cookie
OPTIONS 预检必须显式 exit,且不能有任何输出
文生图接口一旦收到 OPTIONS 请求,必须立刻返回空响应并终止脚本。任何额外字符(包括换行、空格、BOM)都可能导致 Safari 或旧版 Edge 拒绝后续请求。
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(204);
exit;
}
- 用
http_response_code(204)而不是200,语义更准确(No Content),且部分 CDN 对 200 + 空 body 处理不稳定 - 不要在
exit前 echo 任何东西,包括调试用的var_dump—— 它会让响应体非空 - 如果你用的是框架(如 Laravel、ThinkPHP),优先启用其内置 CORS 中间件,避免手动写重复逻辑;手写时务必确保这段判断在路由分发前执行
上线前必须验证的三个盲点
很多开发者本地测通就上线,结果在真实环境翻车。真正决定成败的是这三处:
- 用
curl -I https://your-api.com/generate直连后端,看响应头里有没有Access-Control-Allow-Origin—— 浏览器开发者工具里的 Headers 可能被缓存或代理污染 - 确认 PHP 进程没被 Nginx/Apache 的反向代理覆盖响应头:如果 Nginx 配了
add_header,它可能把 PHP 设置的头全干掉,要么关掉 Nginx 的 CORS 配置,要么用always参数强制覆盖 - 检查 PHP 是否启用了
output_buffering:某些共享主机默认开,会导致header()看似成功实则被缓冲吞掉;临时加ob_end_clean();在header()前可验证是否是此问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











