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

请求子域名cdn.session.com时出现405 Method Not Allowed错误求助

视频流平台CORS预请求405错误排查与解决

问题现象

我正在开发视频流平台,前端基于React实现,内容分发采用Nginx作为CDN服务器,遇到以下异常:

  • 从React应用向cdn.session.com发起请求时,返回405 Method Not Allowed状态码,控制台报错:Cross-origin request blocked ... (Reason: CORS preflight response did not succeeded). Status code: 405
  • 使用CDN服务器IP(172.19.0.10)、主域名session.com/live(经Nginx反向代理到CDN服务器)或/etc/hosts映射到该IP的some.domain.com发起请求时,均能成功获取资源

相关配置信息

/etc/hosts配置

172.19.0.10  some.domain.com  
172.19.0.10 cdn.session.com  
127.0.0.1   session.com  
127.0.0.1   localhost

CDN服务器Nginx跨域配置

add_header Access-Control-Allow-Origin 'http://session.com' always;  
add_header Access-Control-Allow-Credentials 'true' always;  
add_header Access-Control-Allow-Headers 'Origin,Content-Type,rid,Cookie,st-auth-mode';  
add_header Access-Control-Allow-Methods 'GET, OPTIONS';  

失败请求日志(CDN服务器)

172.19.0.1 - - [timestamp] "OPTIONS /live/streamer-0_subsd/index.m3u8 HTTP/1.1" 405 168 "http://session.com/" "browser_version"

React前端反向代理配置(Nginx)

# React Frontend path.
location ~ ^/(.*) {

    proxy_pass http://frontend.session.com/$1$is_args$args;

    # Required for webSocket connetions (react will create them)
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

关键观察点

  • 失败的OPTIONS请求响应头已包含Access-Control-Allow-Origin: http://session.com
  • 直接在浏览器地址栏、curl或ffplay中发起请求(无论使用哪个域名/IP)均成功
  • 所有服务部署在同一Docker桥接网络中

问题分析与解决方案

核心原因

405错误的本质是Nginx未正确处理OPTIONS预请求:虽然配置了Access-Control-Allow-Methods包含OPTIONS,但Nginx默认不会自动响应OPTIONS请求,当预请求到达时,因找不到对应处理逻辑而返回405。而cdn.session.com的请求触发了严格的CORS预检查,其他域名/IP则因同源或预检查规则绕过而未出现问题。

解决步骤

  1. 在CDN服务器的Nginx配置中添加OPTIONS请求处理规则
    在对应资源的location块中增加:

    if ($request_method = OPTIONS) {
        return 204;
    }
    

    该规则会直接返回204 No Content,完成预请求响应,避免Nginx因缺失OPTIONS处理逻辑返回405。

  2. 确认cdn.session.com的server块配置完整性
    检查cdn.session.com对应的Nginx server块,确保其包含了和some.domain.com、session.com/live一致的跨域头配置及OPTIONS处理规则,避免配置遗漏。

  3. 验证Docker容器内部域名解析
    确认React容器内部能正确解析cdn.session.com到172.19.0.10,避免请求被错误路由到其他服务(可在容器内执行nslookup cdn.session.com验证)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:43:10