2015-03-11 6 views
9

Sto tentando di inviare una richiesta di cross-origine DELETE da Chrome utilizzando jQuery.DELETE non consentito da Access-Control-Allow-Methods

Tuttavia, che non con il seguente messaggio di errore essere collegati alla console sviluppatore:

XMLHttpRequest non può caricare http://actual/url/here. Il metodo DELETE non è consentito da Access-Control-Allow-Methods.

il codice JavaScript è in esecuzione su localhost e si presenta così:

$.ajax({ 
    type: "DELETE", 
    url: "http://actual/url/here", 
    xhrFields: { 
     withCredentials: true 
    } 
}); 

Questo si traduce in una richiesta di pre-volo in questo modo di essere inviato:

OPTIONS http://actual/url/here HTTP/1.1 
Host: actual 
Connection: keep-alive 
Access-Control-Request-Method: DELETE 
Origin: null 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36 
Access-Control-Request-Headers: accept 
Accept: */* 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

E la risposta sembra questo:

HTTP/1.1 200 OK 
Cache-Control: must-revalidate, private 
Content-Length: 0 
Server: Microsoft-HTTPAPI/2.0 
Access-Control-Allow-Methods: DELETE GET HEAD POST PUT OPTIONS TRACE 
Access-Control-Allow-Headers: accept 
Access-Control-Max-Age: 900 
Access-Control-Allow-Origin: null 
Access-Control-Allow-Credentials: true 
Date: Wed, 11 Mar 2015 15:03:46 GMT 

Per quanto riguarda Posso dire che va bene. Il client controlla se è consentito inviando Access-Control-Request-Method: DELETE e il server dice che è consentito rispondendo con Access-Control-Allow-Methods: DELETE GET HEAD POST PUT OPTIONS TRACE.

Tuttavia, nessuna richiesta DELETE viene inviata e viene invece visualizzato il messaggio di errore (sopra). Perché?

+0

Forse non avete gestito le OPZIONI prerequisito per altri verbi non adeguatamente sul server: http://stackoverflow.com/questions/20144847/slim-framework -jquery-ajax-request-method-delete-is-non-allowed-by-access – XGreen

risposta

23

Il valore di Access-Control-Allow-Methods deve essere un elenco separato da virgola, non uno spazio separato.

Da MDN:

Access-Control-Allow-Methods: <method>[, <method>]* 
+0

http://www.w3.org/TR/cors/#access-control-allow-methods-response-header dice che il la sintassi è '" Access-Control-Allow-Methods "": "# Method'. '#' Ci dice di separare i token con una virgola? –

+3

"Un costrutto '#' è definito, simile a '*', per definire liste di elementi. Il modulo completo è" # elemento" indicante almeno e al massimo elementi, ciascuno separato da uno o più le virgole (",") e lo spazio bianco lineare OPTIONAL (LWS). " - http://tools.ietf.org/html/rfc2616#section-2.1 – Quentin

+0

Eccellente. Grazie mille! –