2011-12-01 51 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