Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么浏览器不使用XMLHTTPRequest和CORS跟踪重定向?_Javascript_Ajax_Google Chrome_Rest_Cors - Fatal编程技术网

Javascript 为什么浏览器不使用XMLHTTPRequest和CORS跟踪重定向?

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

我正在使用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,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作为新请求的源 请求不使用唯一的安全源

  • 跟踪客户端(即XMLHttpRequest)是否实际请求了
    首先必须发送凭证。当 同一来源请求重定向到不同的来源,即原始来源 无论请求与否,请求都将发送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规范(它是的一部分)现在允许在飞行前进行重定向。有关更多详细信息,请参阅