2015-11-19 2 views
1

Я делаю запрос Ajax, как это:Междоменный Ajax - Почему isXmlHttpRequest возвращает false?

$.ajax({ 
     type: "POST", 
     url: Routing.generate('check_login_ajax'), 
     dataType: 'json', 
     data: { 
      _username: $('#_username').val(), 
      _password: $('#_password').val(), 
      _remember_me: false, 
      _csrf_token: $('#_csrf_token').val() 
     } 
    }).done(function (data) { 
     console.log(data); 
    }); 

Контроллер PHP:

public function CheckLoginAjaxAction() { 
      $request = $this->get('request'); 

      $success = false; 
      $responseCode = 300; 
      if ($request->isMethod('POST') && $request->isXmlHttpRequest()) { 
        $responseCode = 200; 
        $success = true; 
      } 

      $return = json_encode(array('responseCode' => $responseCode, 'success' => $success)); 
    } 

У меня есть на моем сайте xbo.dev:

Object {responseCode: 200, success: true} 

И у меня есть , на моем субдомене blog.xbo.dev:

Object {responseCode: 300, success: false} 

Итак, мой запрос работает, но он не рассматривается как действительный запрос POST xml. Почему?

Кстати, у меня есть еще одна небольшая проблема. Когда я делаю запрос Ajax из поддомена, он не появляется на панели инструментов отладки Symfony2. Вы знаете, как изменить его, и если это возможно?

Symfony2 debug toolbar

Благодаря

+1

Протокол ajax для перекрестного домена по умолчанию запрещен. Если вы хотите сделать это, вы должны явно разрешить это на своем сервере conf –

+0

Как это сделать? –

ответ

1

Я предполагаю, что вы используете JQuery для вызова AJAX, в этом случае JQuery пытается быть умным, когда он обнаруживает запрос междоменная и изменит формат запрос в JSONP. JSONP фактически просто создает тег сценария для запрошенного URL-адреса и запускает результирующий скрипт (подробнее об Wikipedia). Таким образом, запрос, поступающий в ваш контроллер, на самом деле будет GET, а не POST (поскольку jQuery запрашивает скрипт), и поэтому он не появится на панели инструментов Symfony в качестве запроса AJAX.

Чтобы обойти это, вы должны изучить Cross Origin Resource Sharing (CORS), который специально предназначен для решения кросс-доменных запросов AJAX, подобных этому. Подробности реализации этого решения выходят за рамки этого ответа и будут зависеть от поддержки браузера и настройки JavaScript.

+0

Как мы узнаем, что jQuery переключился на JSONP для этого запроса? Может ли это подтвердить каким-либо образом? Иначе это просто спекуляция, как есть. Предложите увеличить ответ таким образом, чтобы пользователь мог проверить это. –

+0

Взгляните на [jQuery documentation] (http://api.jquery.com/jQuery.ajax/) для AJAX, в частности параметр 'dataType', который специально заявляет: «Междоменные« json »запросы преобразуются в« jsonp », если только запрос не включает jsonp: false в его параметрах запроса». –

+0

Да, это должно быть добавлено в ответ, но мы не знаем, какая версия jquery используется на сайте, поэтому способ проверки этого был бы полезен, если возможно –

Смежные вопросы