Кросс-домен AJAX POST в хром - PullRequest
9 голосов
/ 09 мая 2011

Существует несколько тем о проблеме с междоменным AJAX.Я смотрел на них, и вывод, как представляется, заключается в следующем:

Помимо использования чего-то вроде JSONP или решения прокси, вы не должны быть в состоянии сделать простой jquery $ .post () в другой домен

Мой тестовый код выглядит примерно так (работает на "http://myTestdomain.tld/path/file.html")

var myData = {datum1 : "datum", datum2: "datum"}
$.post("http://External-Ip:port", myData,function(return){alert(return);});

Когда я попробовал это (причина, по которой я начал искать), chrome-консоль сказала мне:

XMLHttpRequest не может загрузить http://External -IP: port / page.php . Источник http://myTestdomain.tld не разрешен Access-Control-Allow-Происхождение.

Теперь, насколько я могу судить, это ожидаемо. Я не должен этого делать. Проблема в том, что ПОЧТА на самом деле происходит. У меня естьзапуск простого сценария, который сохраняет $_POST в файл, и становится ясно, что сообщение получает выгоду. Любые реальные данные, которые я возвращаю, не доставляются в мой вызывающий сценарий, что опять-таки кажется ожидаемым из-за проблемы контроля доступа. Но фактто, что сообщение действительно прибыло на сервер, запутало меня.

  • Верно ли, что я предполагаю, что приведенный выше код, выполняющийся на "myTestdomain", не сможет выполнить простой $.post() для другого домена (External-IP)?
  • Ожидается ли, чтозапрос на самом деле поступит в сценарий external-ip, даже если вывод не получен?или это ошибка.(Я использую Chrome 11.0.696.60)

Ответы [ 4 ]

5 голосов
/ 09 мая 2011

Ранее я разместил тикет об этом на багтрекере WebKit, так как думал, что это странное поведение и, возможно, угроза безопасности.

Поскольку заявки, связанные с безопасностью, не доступны для публичного просмотра, я процитируюответ от Джастина Шуха здесь:

Это реализовано именно так, как требуется спецификацией.Для простых запросов перекрестного происхождения http://www.w3.org/TR/cors/#simple-method> предполетной проверки нет;запрос сделан, и ответ не может быть прочитан, если соответствующие заголовки не авторизуют запрашивающий источник.Функционально это ничем не отличается от создания формы и использования сценария для создания POST вне источника (что всегда было возможно).

Итак: вы можете выполнять POST, так как можетев любом случае это можно сделать, внедрив форму и вызвав кнопку отправки с помощью javascript, но вы не увидите результат.Потому что вы не сможете сделать это в сценарии формы.

Решением было бы добавить заголовок к сценарию, выполняющемуся на целевом сервере, например

<?php
header("Access-Control-Allow-Origin: http://your_source_domain");
....
?>

Haven 'Я проверил это, но в соответствии со спецификацией, это должно работать.

Firefox 3.6, кажется, обрабатывает это по-другому, сначала выполнив OPTIONS, чтобы увидеть, может ли он выполнить фактический POST.Firefox 4 делает то же самое, что и Chrome, или, по крайней мере, в моем быстром эксперименте.Подробнее об этом на https://developer.mozilla.org/en/http_access_control

3 голосов
/ 09 мая 2011

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

Чтобы ответить на ваш вопрос, ни один из них не является ошибкой.

  • Запросы не прекращаются до достижения сервера - это дает серверу возможность разрешать эти междоменные запросы, устанавливая соответствующие заголовки 1 .

  • Ответ также возвращается браузером. Перед использованием заголовков контроля доступа 1 ответы на запросы между доменами будут полностью заблокированы браузером, который заботится о безопасности - браузер будет получить ответ, но он не передаст его сценарию. С заголовками контроля доступа сервер имеет возможность установить соответствующие заголовки, указывающие совместимому браузеру, что он хотел бы разрешить определенным исходным URL-адресам выполнять междоменные запросы.

    Точное поведение ответа может отличаться в разных браузерах - сейчас я точно не могу вспомнить, но я думаю, что Chrome вызывает функцию обратного вызова success при использовании jQuery ajax(), но ответ пуст. IIRC, Firefox не будет вызывать функцию success.

0 голосов
/ 09 мая 2011
  1. Да, это правильно, и вы не сможете этого сделать, если не используете какой-либо прокси.

  2. Нет, запрос не будет отправлен навнешний IP, как только есть такое ограничение.

0 голосов
/ 09 мая 2011

Со мной происходит то же самое. Вы можете размещать сообщения в разных доменах, но не можете получить ответ. Это то, что я ожидал, что смогу сделать для меня в Firefox, Chrome и IE.

Одним из способов обойти это предостережение является наличие локального php-файла с вызовом данных через curl и ответом на ваш javascript. (Вроде того, что ты сказал, что уже знал.)

...