La solución para la eliminación de la cabecera en jQuery propuesto por @vamp es en el camino correcto, pero como otros han declarado que aún resultará en un encabezado X-Requerido-Con vacío que se envía.
El beforeSend de devolución de llamada recibe objeto XHR de jQuery (jqXHR), más que el objeto real XMLHttpRequest (XHR), que no está incluso instanciada hasta después de beforeSend se llama.
El método setRequestHeader en jqXHR agrega encabezados a un objeto, que luego se itera más tarde utilizando el método xhr del mismo nombre, justo después de agregar la entrada X-Requerido-With al objeto de encabezados.
Aquí está la parte en jQuery, donde esto está sucediendo:
if (!options.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest";
}
for (i in headers) {
xhr.setRequestHeader(i, headers[ i ]);
}
Lo que nos lleva al problema: Si no se especifica los, evalúa entonces jQuery (a menos de ajuste será el crossdomain X-solicitada-Con cabecera falso, pero esa puede no ser la solución deseada). A continuación, establece inmediatamente los encabezados xhr, que no se pueden deshacer.
Para evitar el envío de los X-solicitada-Con cabecera con jQuery.ajax:
jQuery.ajax proporciona un ajuste, XHR, que anula jQuery incorporado en el método de fábrica para crear el objeto XMLHttpRequest . Al ajustar este método de fábrica y luego ajustar el método setRequestHeader nativo del navegador, se puede ignorar la llamada de jQuery para establecer el encabezado X-Requerido-Con.
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...
});
Creo que una de las ventajas de tener este conjunto de cabecera es para que pueda comprobar en el script del lado del servidor y determinar si era de hecho una petición AJAX y por lo tanto cómo manejarlo? – MrWhite
w3d: y la desventaja de tener al lado del servidor cuando hizo una solicitud de Ajax es que pueden evitar que lo haga en su script de GM – mkoryak