Происхождение не разрешено Access-Control-Allow-Origin

Я делаю Ajax.request для удаленного PHP-сервера в приложении Sencha Touch 2 (завернутый в PhoneGap).

Ответ от сервера следующий:

XMLHttpRequest не может загрузить http://nqatalog.negroesquisso.pt/login.php. Происхождение http://localhost:8888 не допускается с помощью Access-Control-Allow-Origin.

Как я могу исправить эту проблему?

+313
13 апр. '12 в 14:50
источник поделиться
22 ответа

Я написал статью по этой проблеме некоторое время назад, Cross Domain AJAX.

Самый простой способ справиться с этим, если у вас есть контроль над сервером-ответчиком, - это добавить заголовок ответа для:

Access-Control-Allow-Origin: *

Это позволит использовать междоменный Ajax. В PHP вы хотите изменить ответ так:

<?php header('Access-Control-Allow-Origin: *'); ?>

Вы можете просто поместить параметр Header set Access-Control-Allow-Origin * в конфигурацию Apache или файл htaccess. Это просто работает как шарм.

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

+362
13 апр. '12 в 14:54
источник

Связанные вопросы


Похожие вопросы

Если вы не управляете сервером, вы можете просто добавить этот аргумент к своей панели запуска Chrome: --disable-web-security.

Обратите внимание, что я бы не использовал это для обычного "веб-серфинга". Для справки см. Это сообщение: Отключить такую ​​же политику происхождения в Chrome.

Вы используете Phonegap для фактического создания приложения и загрузки его на устройство, это не проблема.

+61
13 апр. '12 в 16:50
источник

Если вы используете Apache, просто добавьте:

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

в вашей конфигурации. Это приведет к тому, что все ответы с вашего веб-сервера будут доступны с любого другого сайта в Интернете. Если вы намерены использовать только сервисы на вашем хосте на определенном сервере, вы можете заменить * на URL-адрес исходного сервера:

Header set Access-Control-Allow-Origin: http://my.origin.host
+41
21 авг. '12 в 7:15
источник

Если у вас есть ASP.NET/ASP.NET MVC, вы можете включить этот заголовок через файл Web.config:

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>
+16
13 авг. '13 в 20:56
источник

Это был первый вопрос/ответ, который появился для меня при попытке решить ту же проблему, используя ASP.NET MVC в качестве источника мои данные. Я понимаю, что это не решает вопрос PHP, но он достаточно связан с тем, чтобы быть ценным.

Я использую ASP.NET MVC. Блог блога от Грега Бранта работал у меня. В конечном итоге вы создаете атрибут [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")], который вы можете добавить к действиям контроллера.

Например:

public class HttpHeaderAttribute : ActionFilterAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }
    public HttpHeaderAttribute(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    }
}

И затем используя его с помощью:

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}
+15
06 июн. '13 в 15:24
источник

Поскольку Matt Mombrea является правильным для серверной части, вы можете столкнуться с другой проблемой, которая является отказом белого списка.

Вам нужно настроить свой phonegap.plist. (Я использую старую версию телефонного разговора)

Для кордовы могут быть некоторые изменения в названии и каталоге. Но шаги должны быть в основном одинаковыми.

Сначала выберите Поддерживаемые файлы > PhoneGap.plist

enter image description here

затем в разделе "ExternalHosts"

Добавьте запись со значением, возможно " http://nqatalog.negroesquisso.pt" Я использую * только для целей отладки.

enter image description here

+10
23 апр. '12 в 4:46
источник

Если вы используете chromer, используйте этот плагин

https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related?hl=en

+9
18 авг. '15 в 10:58
источник

Я сталкивался с этим несколько раз при работе с различными API. Часто быстрое исправление заключается в том, чтобы добавить "& callback =?" до конца строки. Иногда амперсанд должен быть символьным кодом, а иногда и "?": "? Callback =?" (см. Использование API Forecast.io с jQuery)

+7
19 дек. '12 в 0:07
источник

Я дам вам простое решение для этого. В моем случае у меня нет доступа к серверу. В этом случае вы можете изменить политику безопасности в браузере Google Chrome, чтобы разрешить Access-Control-Allow-Origin. Это очень просто:

  • Создать ярлык браузера Chrome
  • Значок правой кнопки мыши → Свойства → Ярлык → Цель

Простая вставка "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security.

Местоположение может отличаться. Теперь откройте Chrome, нажав на этот ярлык.

+7
16 окт. '13 в 4:01
источник

Это может быть полезно для всех, кто нуждается в исключении для версий "www" и "non-www" реферера:

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }
+7
18 июн. '13 в 17:37
источник

если вы находитесь в Apache, просто добавьте файл .htaccess в ваш каталог со следующим содержимым:

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *
+6
02 сент. '15 в 18:31
источник

Если вы пишете расширение Chrome и получаете эту ошибку, убедитесь, что вы добавили базовый URL-адрес API в свой блок полномочий manifest.json, например:

"permissions": [
    "https://itunes.apple.com/"
]
+6
01 февр. '14 в 18:18
источник

Это связано с политикой того же происхождения. Подробнее в Mozilla Developer Network или Wikipedia.

В основном, в вашем примере вам нужно загрузить страницу http://nqatalog.negroesquisso.pt/login.php только с nqatalog.negroesquisso.pt, а не localhost.

+5
13 апр. '12 в 14:51
источник

В Ruby on Rails вы можете сделать в контроллере:

headers['Access-Control-Allow-Origin'] = '*'
+5
03 сент. '13 в 15:51
источник

Вы можете заставить его работать без модификации сервера, включив в ответ HTTP OPTIONS broswer, включая заголовок Access-Control-Allow-Origin: *.

В Chrome используйте это расширение. Если вы находитесь в Mozilla, проверьте этот ответ.

+5
07 апр. '15 в 12:26
источник

Если вы получили это в Angular.js, убедитесь, что вы избегаете номера своего порта следующим образом:

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

Подробнее см. здесь.

+5
18 апр. '13 в 9:23
источник

У нас также есть та же проблема, что и приложение phonegap, протестированное в хроме. Одна машина Windows, которую мы используем ниже пакетного файла каждый день перед тем, как открыть Chrome. Помните, прежде чем запускать это, вам нужно очистить весь экземпляр chrome от диспетчера задач или вы можете выбрать хром, чтобы он не работал в фоновом режиме.

BATCH: (используйте cmd)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security
+4
11 мар. '13 в 6:37
источник
 **Add this meta tag in your Webservice**


 header('Content-type: application/json');
 header('Access-Control-Allow-Origin: *');
+1
12 янв. '17 в 18:40
источник

Если вы работаете с Chrome, вы можете просто установить расширение Chrome из магазина Chrome, чтобы решить проблемы, связанные с CORS.

Расширение: ссылка Allow-Control-Allow-Origin: [ https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en][1]

+1
27 дек. '17 в 7:10
источник

В Ruby Sinatra

response['Access-Control-Allow-Origin'] = '*' 

для всех или

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
+1
07 июн. '15 в 20:16
источник

Когда вы получите запрос, вы можете

var origin = (req.headers.origin || "*");

чем при ответе на вызов:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
0
09 сент. '14 в 23:10
источник

Подстановочный знак не очень безопасный вариант. Вы хотите, чтобы это было более конкретно - проверьте ответ, который я написал здесь по тому же вопросу; как обойти Access-Control-Allow-Origin?

-1
24 апр. '15 в 9:30
источник

Посмотрите другие вопросы по меткам или Задайте вопрос