请求子域名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则因同源或预检查规则绕过而未出现问题。
解决步骤
在CDN服务器的Nginx配置中添加OPTIONS请求处理规则
在对应资源的location块中增加:if ($request_method = OPTIONS) { return 204; }该规则会直接返回204 No Content,完成预请求响应,避免Nginx因缺失OPTIONS处理逻辑返回405。
确认
cdn.session.com的server块配置完整性
检查cdn.session.com对应的Nginx server块,确保其包含了和some.domain.com、session.com/live一致的跨域头配置及OPTIONS处理规则,避免配置遗漏。验证Docker容器内部域名解析
确认React容器内部能正确解析cdn.session.com到172.19.0.10,避免请求被错误路由到其他服务(可在容器内执行nslookup cdn.session.com验证)。
内容的提问来源于stack exchange,提问作者saltypretzel
相关产品推荐
相关产品推荐

