Zend Framework 2 - запрос AJAX с другого сервера

У меня 2 домена (домен А, домен Б).

На домене А ставится приложение ZF2 и все ок.

На домене B размещается Landing Page (небольшой сайт с формой для сбора данных).

С целевой страницы я хочу отправить данные формы в приложение в домене A (запрос AJAX).

К сожалению, приложение ZF2 в домене A не получило данных и не показало результатов. Все в порядке, когда я делаю запрос AJAX из того же домена, где находится приложение ZF2.

Я пытался использовать JSONP, но безуспешно.

У меня нет другого понятия, как заставить это работать.


person user1853459    schedule 28.11.2012    source источник


Ответы (3)


Как говорится в ответе Бодгана, это проблема безопасности браузера, а не проблема ZF2. Один из популярных способов обойти это — изменить ACCESS-CONTROL-ALLOW-ORIGIN вашего домена A, чтобы разрешить запросы из домена B. Это и другие решения обсуждаются на странице Mozilla Developer Network (MDN) для Управление доступом к HTTP (CORS).

По сути, вам нужно указать принимающему серверу (домен А), что он может отвечать на запросы ресурсов. Вы можете сделать это в файле .htaccess, размещенном в корневом каталоге веб-сайта домена A. Ниже приведен пример простого кода, указывающего домену A, что он должен отвечать на запросы о совместном использовании ресурсов со всех доменов: *. Статья MDN, ссылка на которую приведена выше, посвящена более подробному обсуждению «Совместного использования ресурсов между источниками (CORS)». Имейте в виду, что есть последствия для безопасности, и в большинстве случаев вы не хотите открывать свой сервер для запросов из * источников, а скорее для определенного хоста, контролируемого вами.

Options +FollowSymlinks
RewriteEngine on

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
person Alex Ross    schedule 28.11.2012
comment
Это также можно сделать в php с помощью функции header(), например: header('Access-Control-Allow-Origin: *');, но имейте в виду, что она должна быть вызвана до того, как какие-либо выходные данные будут отправлены в браузер. См. также: enable-cors.org и stackoverflow.com/questions/1653308/ - person David; 29.11.2012

Вы можете изменить свой файл htaccess для поддержки, но проще всего использовать класс ответа:

$this->_response->setHeader('Access-Control-Allow-Origin', '*');

http://framework.zend.com/manual/2.0/en/modules/zend.http.response.html

Если вы используете json в качестве источника данных конечной точки, используйте его в сочетании с помощником json, который установит ваши заголовки кодирования и некоторые другие вещи.

$this->_helper->json->sendJson($jsonIsite);

http://framework.zend.com/manual/2.0/en/modules/zend.json.introduction.html

есть https://github.com/zf-fr/zfr-cors для продвинутых CORS с ZF2, но простая конечная точка json с указанным выше должна работать нормально.

person dmo    schedule 06.01.2015
comment
В моем примере я использовал подстановочный знак CORS * — убедитесь, что вы провели исследование и используете соответствующий домен в целях безопасности. - person dmo; 06.01.2015

Междоменные ajax-запросы запрещены по соображениям безопасности (это называется политикой единого происхождения). http://en.wikipedia.org/wiki/Same_origin_policy

person Bogdan Burym    schedule 28.11.2012