Междоменный AJAX не отправляет заголовок X-Requested-With - PullRequest
46 голосов
/ 17 ноября 2011

Создайте веб-сервис на http://www.a.com/service.asmx и отправьте ему междоменный запрос ajax с http://www.b.com. Проверьте заголовки в Firebug или в Live HTTPЗаголовки или любой другой плагин, который вы пожелаете.

Нет никаких следов поля заголовка HTTP X-Requested-With среди заголовков запроса.

Однако, если вы отправите запрос ajax на тот же сервис из того же домена (например, http://www.a.com/about),, вы увидите это поле заголовка.

Почему X-Requested-With Поле заголовка пропущено для междоменных запросов Ajax?

Обновление: Я знаю, что вызовы JSONP не являются вызовами AJAX по своей природе. Таким образом, вы не будетесм. любое поле заголовка X-Requested-With в вызовах JSONP.

1 Ответ

75 голосов
/ 22 октября 2012

Если вы используете jQuery для выполнения вашего ajax-запроса, он не будет отправлять заголовок X-Requested-With (HTTP_X_REQUESTED_WITH) = XMLHttpRequest, поскольку он является междоменным. Но есть 2 способа исправить это и отправить заголовок:

Вариант 1) Вручную установите заголовок в вызове ajax:

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

Вариант 2) Скажите jQuery не использовать междоменные значения по умолчанию, поэтому он сохранит заголовок X-Requested-With в запросе ajax:

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

Но при этом сервер должен разрешить эти заголовки, а затем сервер должен распечатать эти заголовки:

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

Первая строка выше позволит избежать ошибки «Источник не разрешен Access-Control-Allow-Origin.»
Вторая строка позволит избежать ошибки «Поле заголовка запроса X-Requested-With не разрешено Access-Control-Allow-Headers.»

...