La soluzione per rimuovere l'intestazione in jQuery proposto dalla @vamp è sulla strada giusta, ma come altri hanno dichiarato che provocherà comunque l'invio di un'intestazione X-Requested-With vuota.
Il beforeSend callback riceve oggetto XHR jQuery (jqXHR), piuttosto che l'oggetto effettivo XMLHttpRequest (XHR), che non è nemmeno istanziata solo dopo beforeSend viene chiamato.
Il metodo setRequestHeader in jqXHR aggiunge intestazioni a un oggetto, che viene quindi iterato in seguito utilizzando il metodo xhr con lo stesso nome, subito dopo l'aggiunta della voce X-Requested-With all'oggetto headers.
ecco la parte in jQuery in cui questo sta accadendo:
if (!options.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest";
}
for (i in headers) {
xhr.setRequestHeader(i, headers[ i ]);
}
che conduce al problema: se non si specifica i, valuta quindi jQuery (a meno che l'impostazione del crossdomain X-richiesta-Con intestazione falso, ma potrebbe non essere la soluzione desiderata). Quindi imposta immediatamente le intestazioni xhr, che non possono essere disinserite.
Per evitare l'invio del X-richiesta-Con intestazione con jQuery.ajax:
jQuery.ajax offre un ambiente, XHR, che sostituisce jQuery integrato nel metodo factory per creare l'oggetto XMLHttpRequest . Con il wrapping di questo metodo factory e quindi il wrapping del metodo setRequestHeader nativo del browser, la chiamata da jQuery per impostare l'intestazione X-Requested-With può essere ignorata.
jQuery.ajax({
url: yourAjaxUrl,
// 'xhr' option overrides jQuery's default
// factory for the XMLHttpRequest object.
// Use either in global settings or individual call as shown here.
xhr: function() {
// Get new xhr object using default factory
var xhr = jQuery.ajaxSettings.xhr();
// Copy the browser's native setRequestHeader method
var setRequestHeader = xhr.setRequestHeader;
// Replace with a wrapper
xhr.setRequestHeader = function(name, value) {
// Ignore the X-Requested-With header
if (name == 'X-Requested-With') return;
// Otherwise call the native setRequestHeader method
// Note: setRequestHeader requires its 'this' to be the xhr object,
// which is what 'this' is here when executed.
setRequestHeader.call(this, name, value);
}
// pass it on to jQuery
return xhr;
},
success: function(data, textStatus, jqXHR) {
// response from request without X-Requested-With header!
}
// etc...
});
Credo che uno dei vantaggi di avere questo insieme intestazione è così che si può verificare la presenza di essa nello script lato server e stabilire se si trattava effettivamente di una richiesta AJAX e, pertanto, come gestirlo? – MrWhite
w3d: e lo svantaggio di sapere lato server quando hai fatto una richiesta Ajax è che possono impedirti di farlo nel tuo script GM – mkoryak