O AJAX entre domínios não envia o header X-Requested-With

Crie um serviço da Web em http://www.a.com/service.asmx e envie uma solicitação de ajax entre domínios para ele em http://www.b.com . Verifique os headers no Firebug , no Live HTTP Headers ou em qualquer outro plugin que você desejar.

Não há nenhum vestígio do campo Cabeçalho HTTP Solicitado com X entre headers de solicitação.

No entanto, se você enviar uma solicitação de ajax para o mesmo serviço do mesmo domínio (por exemplo, http://www.a.com/about ), verá esse campo de header.

Por que o campo de header X-Requested-With foi omitido para solicitações de ajax entre domínios?

Atualização: Eu sei que chamadas JSONP não são chamadas AJAX na natureza. Assim você não verá nenhum campo de header X-Requested-With , em chamadas JSONP.

Se você estiver usando o jQuery para fazer seu pedido ajax, ele não enviará o header X-Requested-With (HTTP_X_REQUESTED_WITH) = XMLHttpRequest, porque é um domínio cruzado. Mas há duas maneiras de corrigir isso e enviar o header:

Opção 1) Defina manualmente o header na chamada ajax:

$.ajax({ url: "http://your-url...", headers: {'X-Requested-With': 'XMLHttpRequest'} }); 

Opção 2) Diga ao jQuery para não usar padrões de domínio cruzado, assim ele manterá o header X-Requested-With no pedido do ajax:

 $.ajax({ url: "http://your-url...", crossDomain: false }); 

Mas com isso, o servidor deve permitir esses headers e, em seguida, o servidor precisa imprimir esses headers:

 print "Access-Control-Allow-Origin: *\n"; print "Access-Control-Allow-Headers: X-Requested-With, Content-Type\n"; 

A primeira linha acima evitará o erro “Origem não é permitida pelo Access-Control-Allow-Origin.”
A segunda linha evitará o erro “O campo de header de solicitação X-Requested-With não é permitido pelo Access-Control-Allow-Headers.”