Ajax CORS和Azure存储(PHP)

Ajax CORS和Azure存储(PHP),ajax,azure,blob,azure-storage,cors,Ajax,Azure,Blob,Azure Storage,Cors,我正在尝试使用WindowsAzure的PHPSDK——它既不支持CORS,也不支持共享访问密钥 在重写SDK以允许我生成SAS和必需的查询字符串,并为感恩节更新(允许CORS通过REST API更新到存储)重写SDK之后,我遇到了一个难题 我成功地创建了SAS,并可以通过它们读入文件。 同样,我的CORS要求如下: <StorageServiceProperties> <Cors> <CorsRule> <AllowedOrig

我正在尝试使用WindowsAzure的PHPSDK——它既不支持CORS,也不支持共享访问密钥

在重写SDK以允许我生成SAS和必需的查询字符串,并为感恩节更新(允许CORS通过REST API更新到存储)重写SDK之后,我遇到了一个难题

我成功地创建了SAS,并可以通过它们读入文件。 同样,我的CORS要求如下:

<StorageServiceProperties>
  <Cors>
    <CorsRule>
      <AllowedOrigins>
         *
      </AllowedOrigins>
      <AllowedMethods>
        GET, PUT, POST, DELETE, HEAD, OPTIONS
      </AllowedMethods>
      <MaxAgeInSeconds>
        500
      </MaxAgeInSeconds>
      <ExposedHeaders>
        x-ms-meta-data*,x-ms-meta-customheader
      </ExposedHeaders>
      <AllowedHeaders>
        x-ms-meta-target*,x-ms-meta-customheader
      </AllowedHeaders>
    </CorsRule>
  </Cors>
  <DefaultServiceVersion>
    2013-08-15
  </DefaultServiceVersion>
</StorageServiceProperties>

*
获取、放置、发布、删除、标题、选项
500
x-ms-meta-data*,x-ms-meta-customheader
x-ms-meta-target*,x-ms-meta-customheader
2013-08-15
我接收到的响应
HTTP\u Request2\u响应对象([version:protected]=>1.1[code:protected]=>202[reasonPhrase:protected]=>Accepted[effectiveUrl:protected]=>?restype=service&comp=properties[headers:protected]=>Array([transfer-encoding]=>chunked[server]=>WindowsAzure Blob/1.0 Microsoft HTTPAPI/2.0[x-ms-request-id]=>59bc0e05-4767-4953-9df1-2d2a6a9054bc[x-ms-version]=>2013-08-15[date]=>2013年12月13日星期五11:23:49 GMT][cookies:protected]=>Array()[lastHeader:protected]=>date[bodyEncoded:protected]=>1]

我还通过对输入的任何部分进行错误格式化进行了检查,它确实失败了,并发送了400个失败响应

所以现在我在我的网页上写了一个应用程序,它应该允许用户直接将文件上传到存储帐户,但我仍然收到错误

OPTIONS 403(服务器无法验证请求。请确保包含签名的授权标头的值格式正确。)jquery.js:8706
选项请求的资源上不存在“Access Control Allow Origin”标头。因此不允许对源“”进行访问。jquery.js:8706
无法加载XMLHttpRequest。请求的资源上不存在“访问控制允许来源”标头。因此不允许来源访问。azure_blob.html:1
错误

我不知道从这里继续到哪里…我感觉我已经启用了CORS,我感觉SAS正在工作,但它告诉我我的存储帐户的CORS支持已关闭,我甚至不知道如何通过REST API/Azure SDK检查这是否正确

编辑:谢谢Guarav…问题确实是在我的标题中添加了
内容类型

对于任何一个很快看到这一点的人:我将修复代码,使其变得更好,并实现一些其他的事情,然后向PHPSDK提交一个pull请求,这样您就不必再进行此操作了


我只执行了与新更新相关的CORS。在提交请求之前,我将执行其他serviceProperty更新,可能还有其他内容。

尝试在CORS请求中的
部分添加以下标题:

  • x-ms-*(将负责x-ms-blob-type等类型的标题)
  • 内容长度(我在使用CORS的实验中注意到,这是由浏览器自动添加的,如果我没有将其包含在CORS标题中,则会出现403错误)
  • 接受(我在使用CORS的实验中注意到,这是由浏览器自动添加的,如果我没有将其包含在CORS标题中,我会得到403错误)
  • 内容类型

或者,您可以通过类似于
Fiddler
的工具跟踪请求,查看请求中发送的所有请求标头,并根据您的CORS规则进行匹配。

尝试在CORS请求的
部分添加以下标头:

  • x-ms-*(将负责x-ms-blob-type等类型的标题)
  • 内容长度(我在使用CORS的实验中注意到,这是由浏览器自动添加的,如果我没有将其包含在CORS标题中,则会出现403错误)
  • 接受(我在使用CORS的实验中注意到,这是由浏览器自动添加的,如果我没有将其包含在CORS标题中,我会得到403错误)
  • 内容类型

或者你可以通过像
Fiddler
这样的工具来跟踪请求,查看请求中发送的所有请求头,并将它们与你的CORS规则进行匹配。

嘿,Guarav,我经常利用你的博客来试图弄清楚这一点……多么有趣……不幸的是,这些都不起作用——我将尝试使用Fiddler(我以前没有这样做过)小世界!你能分享更新的CORS设置吗?如果你想玩CORS设置,我的公司为此发布了一个免费工具:。你可以使用这个工具来玩CORS设置。哇,太棒了。至少我现在看到我确实修复了CORS设置。除了添加你提到的3个设置之外,它们确实都在那里。我要走了假设这意味着我搞砸了后半部分,那么?也许我试图上传到错误的位置/不正确地使用SAS…我可以在生成链接后成功读取,但我只是生成了一个带有对容器的写入的密钥。我认为您收到的错误告诉您CORS设置有问题,因为您我们在飞行前的“选项”请求中遇到错误。你的代码还没有上传blob。是的,这很明显——我已经注册了很长时间了……I.imgur.com/nnkiou.png这是它在你的应用程序中显示的内容——我刚刚删除了网站名称(这是正确的).嘿,瓜拉夫,我经常利用你的博客来试图弄明白这一点……多么有趣……不幸的是,这些都不起作用——我将尝试使用Fiddler(我以前没有这样做过)小世界!你能分享更新的CORS设置吗?如果你想玩CORS设置,我的公司为此发布了一个免费工具:。你可以使用这个工具玩CORS设置。哇,太棒了。至少我现在看到我确实修复了CORS设置。除了添加3个设置之外,它们确实都在那里