Javascript 为什么浏览器不使用XMLHTTPRequest和CORS跟踪重定向?
我正在使用RESTfulAPI为某些服务编写一个web应用程序。API可在Javascript 为什么浏览器不使用XMLHTTPRequest和CORS跟踪重定向?,javascript,ajax,google-chrome,rest,cors,Javascript,Ajax,Google Chrome,Rest,Cors,我正在使用RESTfulAPI为某些服务编写一个web应用程序。API可在https://api.example和应用程序位于https://app.example。使用CORS的简单GET请求在Chrome和Firefox中运行良好。一些方法通过POST接受数据,并在位置头中返回带有新uri的303代码 飞行前选项请求正常: 请求方法:选项 状态代码:200 OK 请求头 接受:*/* 接受字符集:UTF-8,*;q=0.5 接受编码:gzip、deflate、sdch 接受语言:en-US
https://api.example
和应用程序位于https://app.example
。使用CORS的简单GET请求在Chrome和Firefox中运行良好。一些方法通过POST接受数据,并在位置头中返回带有新uri的303代码
飞行前选项请求正常:
请求方法:选项
状态代码:200 OK
请求头
接受:*/*
接受字符集:UTF-8,*;q=0.5
接受编码:gzip、deflate、sdch
接受语言:en-US,en;q=0.8,ru;q=0.6
访问控制请求头:来源、授权、内容类型
访问控制请求方法:POST
连接:保持活力
DNT:1
主机:api.example
来源:https://app.example
推荐人:https://app.example/app/
用户代理:Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.32(KHTML,类似Gecko)Chrome/27.0.1425.0 Safari/537.32 SUSE/27.0.1425.0
响应头
访问控制允许凭据:true
访问控制允许标头:授权、内容类型
访问控制允许方法:GET、POST、PUT、DELETE、HEAD、OPTIONS
访问控制允许来源:https://app.example
访问控制公开标头:*
访问控制最大年龄:3628800
连接:保持活力
内容长度:0
日期:2013年5月5日星期日15:22:50 GMT
服务器:nginx/1.2.5
然后实际请求在收到303后停止:
请求URL:https://api.example
申请方式:邮寄
状态代码:HTTP/1.1 303参见其他
响应标题:
服务器:nginx/1.2.5
地点:https://api.example/some_url
日期:2013年5月5日星期日15:27:49 GMT
内容类型:application/json
内容长度:0
连接:保持活力
访问控制最大年龄:3628800
访问控制公开标头:*
访问控制允许来源:https://app.example
访问控制允许方法:GET、POST、PUT、DELETE、HEAD、OPTIONS
访问控制允许标头:授权、内容类型
访问控制允许凭据:true
通过RFC,用户代理应该遵循重定向,但Chrome和FF的行为似乎并不像预期的那样。这是浏览器的错误还是我做错了什么
更新:如果我开始使用chromium--禁用web安全,一切正常。如果是chromium错误,chromium Support提供的代码中可能出现的错误如下:
不要对重定向响应强制执行访问控制检查
本身,因为导致重定向的请求是
同源
使用原始请求的URL作为新请求的源 请求不使用唯一的安全源
首先必须发送凭证。当 同一来源请求重定向到不同的来源,即原始来源 无论请求与否,请求都将发送cookie,因为它是 同源。新的跨源请求不应发送cookie 除非他们被要求,否则访问控制会检查 如果服务器允许,响应将成功 “访问控制允许原点=*”
我也一直在努力解决这个问题。规范似乎禁止对预飞CORS请求进行3xx重定向 根据规范: (第1步和第2步。详细说明预照明过程。以及我们进入第……步的步骤) …3。这是实际请求。应用“提出请求”步骤并遵守 发出请求时,请求规则如下 如果响应的HTTP状态代码为301、302、303、307或308 应用 然后,如果我们向下滚动到: 每当应用网络错误步骤时,终止算法 调用这组步骤并设置跨源请求状态的 网络错误 注意:这对用户凭据的设置没有影响。也就是说,如果阻塞 cookies标志未设置,cookies将由响应设置 每当应用缓存和网络错误步骤时,请遵循以下步骤 步骤: 删除飞行前结果缓存“原点”字段中的条目 值是源源源和url字段值的区分大小写的匹配项 是请求URL的区分大小写的匹配项 应用网络错误步骤,就像调用 缓存和网络错误步骤调用了网络错误步骤 相反 (重点摘自文件。)
但是,对于简单的CORS请求,允许3xx重定向。对于“真实”请求(不是CORS飞行前请求),您的请求头是什么?我遇到了一个非常类似的问题。你有没有解决过这个问题?看起来Chromium中的这个bug报告可能与@vrutberg有关是的,看起来完全一样。此外,它有时也有效。例如,在Chrome和FF中,msdn测试均通过。我的一个朋友把完全相同的代码放在他的服务器上,但它不工作@vrutberg I至今尚未解决此问题:(你在这方面有什么进展吗?我不再认为这与我之前提到的bug报告中描述的问题完全相同。如果我避免提出飞行前请求,它对我有效。bug报告根本没有提到飞行前请求。我在Chromium's或Fir中都找不到关于这方面的确切bug报告。)efox的bug追踪器。我相信他的问题不涉及同一来源的请求。这是一个跨来源的请求,有302响应。请注意,当前的CORS规范(它是的一部分)现在允许在飞行前进行重定向。有关更多详细信息,请参阅