Та же политика происхождения - JavaScript вызывает PHP - PullRequest
4 голосов
/ 27 октября 2010

Я знаю, что это популярная тема, но мне еще не удалось найти исчерпывающий ответ.

Я пытаюсь создать для наших «клиентов» простой способ размещения карты Google.на их веб-сайте, который отображает положение наших клиентов (или их подмножество) на карте.Клиенты находятся в базе данных MySQL, которая на лету превращается в XML с помощью сценария PHP (согласно примеру Google).На моем веб-сайте это работает нормально, но когда я пробую его на другом веб-сайте, xmlHTTPRequest не может смотреть на PHP, так как он находится в другом домене.

Я могу обойти это, написав другой файл PHP в другом доменекоторый просто читает файл PHP в исходном домене.Но не все наши клиенты будут иметь PHP на своих серверах.Можно ли как-нибудь вернуть результаты XML из нашей базы данных, используя JavaScript?

Пара моментов:

  1. JavaScript, который делает xmlHTTPRequest, все еще находится на наш сервер - наши клиенты ссылаются на него из тега скрипта.Я подумал, что этого может быть достаточно, но «происхождение» (согласно Chrome, в любом случае) все еще рассматривается как домен # 2

  2. Это здорово: если я использую абсолютную ссылку вxmlHTTPRequest (например, request.open ('GET', 'http://mydomain.com/api/foo.php', true)), тогда он не будет работать в IE, но если я использую относительную ссылку (' /api/foo.php '), он будет работать.

  3. Я не знаю достаточно об этом, но могу ли я использовать JSON?Я видел: 'script src = "http: //..../someData.js? Callback = some_func"' но не знаю, как, я бы сделал так, чтобы 'someData.js' выглядел как JSON?(Я очень много думаю о функциях, что, вероятно, неверно?).

  4. Я попытался добавить: header ("Access-Control-Allow-Origin: *");к вершине PHP, который выводит XML, но я не могу сказать, что он мало что делает!

  5. Если я использую оболочку PHP на клиентском сервере, в чем преимуществоиспользуя запрос cURL, а не просто file_get_contents или fopen?

Извините, много вопросов, но любые рекомендации будут высоко оценены.

Огромное спасибо,

Мат

Ответы [ 3 ]

6 голосов
/ 27 октября 2010

Простой способ обойти это - позволить вашему PHP-скрипту вернуть что-то вроде:

callback_function(YOUR_DATA);

Затем в JS-скрипт, включенный в сайт клиента, вы динамически вставляете <script>, в котором src указывает на ваш PHP-скрипт:

(function() {
    var scriptElement   = document.createElement('script');
    scriptElement.type  = 'text/javascript';
    scriptElement.async = true;
    scriptElement.src   = 'http://example.org/yourScript.php?data=...';
    var container       = document.getElementsByTagName('script')[0];
    container.parentNode.insertBefore(scriptElement, container);
})();

Этот метод называется JSONP и должен делать именно то, что вы хотите;)

Другим способом решения этой проблемы было бы разрешение междоменного XMLHttpRequest в Политике безопасности контента. Но я думаю, что только Firefox 4 поддерживает это прямо сейчас.

1 голос
/ 27 октября 2010

Можете ли вы использовать JSON вместо XML? Если это так, ваш вариант 3), вероятно, будет вашим лучшим выбором. При таком подходе существуют угрозы безопасности, и его следует использовать только для известных и надежных источников.

Подробнее: http://www.codeproject.com/KB/aspnet/JSONToJSONP.aspx

0 голосов
/ 27 октября 2010

JavaScript на стороне клиента, а база данных - нет. JavaScript не может напрямую извлекать базу данных MySQL.

...