Ошибка XMLHttpRequest кросс-домен бросает - PullRequest
0 голосов
/ 19 марта 2012

Я создал API для голосования для верхнего сайта для сайтов, зарегистрированных для использования.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

    <script type="text/javascript">

        var id = 1;

        $(document).ready(function(){
            $.getJSON("http://mysite.com/index.php?page=vote", { id: id, hasVoted: 'unknown' }, function(data) {
                if(data == 2) {
                    window.location.replace("http://mysite.com/index.php?page=vote&id=" + id);
                }
            });
        });

    </script>

По сути, я даю пользователю их ID, а затем они помещают этот код в свои файлы. Сайт возвращает номер и после этого перенаправляет пользователя или не голосует.

Итак, тестирование на localhost, что код выдает эту ошибку:

 XMLHttpRequest cannot load http://mysite.com/index.php?page=vote&id=1&hasVoted=unknown. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

Если я использую этот код:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

    <script type="text/javascript">

        var id = 1;

        $(document).ready(function(){
            $.getJSON("http://mysite.com/index.php?page=vote&callback=?", { id: id, hasVoted: 'unknown' }, function(data) {
                if(data == 2) {
                    window.location.replace("http://mysite.com/index.php?page=vote&id=" + id);
                }
            });
        });

    </script>

Тогда это ничего не делает. Это не выбрасывает ошибки. (Хотя данные должны быть равны 2 (при прямой проверке этого URL возвращается 2)).

И, если я попытаюсь сделать небольшой тест и сделать alert(data); Это ничего не выбрасывает.

Я совершенно не в курсе этого. Все поможет.

1 Ответ

2 голосов
/ 19 марта 2012

Общеизвестная проблема, контроль источника в браузере:

Браузер не позволяет по умолчанию отправлять запросы ajax к доменам «кросс-происхождения».Перекрестное происхождение означает, что порт или хост разные.Поэтому вы не можете отправлять запросы на сайт http://siteB/, в то время как скрипт для выполнения запросов размещен на сайте A.

Простым решением было бы разместить все в одном домене и сделать URL-адрес относительным.Если это невозможно, вам нужно найти другой способ не совершать звонки из разных стран.Некоторые примеры:

  1. JSONP (только GET)
  2. CORS (работа с современным браузером очень хорошая)
  3. включает ifram + использование PostMessage между окнами
  4. прокси-скрипт

РЕДАКТИРОВАТЬ: Сначала я бы разрешил вашему API-серверу кое-что, установив следующие заголовки:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Authorization");

Имейте в виду, что этоне работает должным образом с Internet Explorer, поэтому вы должны использовать: XDomainRequest.Но это не позволяет отправлять заголовки.Пожалуйста, посмотрите мой вопрос пару дней назад, если вам нужно отправить заголовки кросс-происхождения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...