2011-12-01 49 views
7

我使用backbone.js的模型。当我保存模型时,它会在Firefox上向服务器端发送HTTP OPTIONS方法,但是会向Safari发送HTTP POST方法。使用Javascript请求的Http选项方法

我知道这不是一个关于backbone.js的问题,它是关于CORS的。我将只检查服务器端的方法GET,POST,PUT和DELETE,我不会使用HTTP OPTIONS方法执行任务。

我的请求的URL是我的API:api.foo.com 和API从请求:bar.com

所以,我怎么能在所有浏览器的控制要求我api.foo.com与HTTP POST不OPTIONS ? 以及如何与其他域的所有请求共享api.foo.com的内容?

注:我已经从服务器端的响应变化的标头:访问控制允许来源:*

回答

7

选项请求实际上是所谓的preflight request of the CORS specification。 Web浏览器使用此预检请求来检查服务器将接受来自相应来源的请求的条件。如果对预检请求的响应令人满意,浏览器将发送实际的请求。

所以要遵守这个规范,你需要你的服务器来重现steps of preflight request processing

+0

那么,如何设置浏览器不检查服务器会接受请求的条件?它会在每次发布请求之前检查?因为,我希望执行我的JavaScript的每个浏览器只发送POST方法到我的服务器端脚本 –

+0

@davit你不能。由于安全原因([CSRF](https://www.owasp.org/index)),跨源请求无法与[原始XHR](http://www.w3.org/TR/XMLHttpRequest/)一起使用。 PHP /交叉Site_Request_Forgery))。 [XHR等级2](http://www.w3.org/TR/XMLHttpRequest2/)使其成为可能,但要求符合CORS规范。 – Gumbo

+0

@davit尽管GET被称为[简单方法](http://www.w3.org/TR/cors/#simple-method),但是[简单的跨域请求](http:// www .w3.org/TR/cors /#simple-cross-origin-request)仅当* force预检标志*为假(即它不是* XMLHttpRequestUpload *请求)并且没有其他标头字段在请求中而不是[简单的头域](http://www.w3.org/TR/cors/#simple-header)。 – Gumbo