【发布时间】:2025-12-23 23:40:07
【问题描述】:
IE 10 支持 CORS。 Amazon S3 支持 CORS。
我们可以在除 IE 10 之外的所有浏览器中直接从站点到 S3 上传(IE 9 不受影响)。它的工作原理是这样的:
用户选择一个文件(拖放或从文件输入中选择)
(POST) 我们必须在请求进入 S3 (
$.post('/static/sign_asset', { ... }) 之前“签署”请求,它有一个全天完美触发的回调。(POST) 然后我们使用文件数据和来自签名等的数据将 XHR 制作为 S3。
文件上传完毕,除了...
问题始于 IE 10:
在 Access-Control-Allow-Origin 标头中找不到 Origin null。 和 XMLHttpRequest:网络错误 0x80070005,访问被拒绝。 没有其他浏览器显示这是在我们在发送响应的控制器中设置
response.headers["Access-Control-Allow-Origin"] = "*"之后。即使我们犯了这个错误,Chrome 也会显示这个错误,但请求仍然会通过。尽管出现此错误,但文件实际上确实已上传到 S3。 Amazon S3 确实是 303 redirect thing - 这是我们对文件已成功上传的验证。
(GET) 这是对 CORS Ajax 请求的重定向,因此“重定向”不会刷新页面,它只是返回并访问我们的服务器。 IE 10 使用
multipart/form-data; boundary=---------------------------7dd2ce2201da的内容类型
这就是导致 Rails 出错的原因。
Started GET "/static/signed/asset/tsabat/83ee6840-7158-0130-c19b-28cfe912f6ff?bucket=s.cdpn.io&key=5%2Fauthor-tim_2.jpg&etag=%2260fb3876d516553ff6f3a018066b3250%22" for 127.0.0.1 at
2013-03-17 10:46:36 -0700
EOFError - bad content body:
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:74:in `block in Rack::Multipart::Parser#fast_forward_to_first_boundary' (gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#fast_forward_to_first_boundary'
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:72:in `Rack::Multipart::Parser#parse'
(gem) rack-1.4.5/lib/rack/multipart/parser.rb:15:in `Rack::Multipart.parse_multipart'
(gem) rack-1.4.5/lib/rack/multipart.rb:25:in `ActionDispatch::Request#parse_multipart'
(gem) rack-1.4.5/lib/rack/request.rb:336:in `ActionDispatch::Request#POST'
(gem) rack-1.4.5/lib/rack/request.rb:201:in `ActionDispatch::Request#POST'
Safari 也失败了 (6.0.2)
Safari 返回 200 状态码,Rails 不会因为重定向而感到害怕,但 xhr.status 是错误的。 xhr.readyState == 4,但 xhr.status == 0。我们一直在寻找 200 以确保它正常工作。这很容易修复,但仍然......
Chrome does fine - 似乎没有设置 Content-Type
Firefox does fine - 内容类型application/json; charset=utf-8
example pages 显示了 IE 10 处理 CORS 的能力,但它们不处理此重定向问题。
【问题讨论】:
-
我会给你一个 +1 以防你真的是 Chris Coyier。 (而且这个问题写得很好,所以无论如何它都值得 +1,但是你的 CSS-tricks 网站......是我的样式备忘单。)
-
您是否尝试过使用Fiddler 检查传入/传出流量?与 Chrome 相比,我很好奇 IE 的标题是什么样的。
-
IE 的标头 == cl.ly/Ndii
-
Chrome 标头 == cl.ly/NdOD
-
@ChrisCoyier 我通过推特联系了我。如果可能的话,很想对一个活生生的例子进行故障排除。正如您所指出的,IE10 与 CORS 配合得很好,有很多很好的例子,所以我很好奇是什么导致了这些问题。让我知道是否可以安排这种类型的访问。
标签: amazon-s3 amazon internet-explorer-10 cors