Происхождения не допускается по контроля доступа-разрешить-происхождение


Я Ajax.request на удаленный PHP сервер в Сенча Touch приложение 2 (завернутый в PhoneGap).

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

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

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

22 308

22 ответа:

Я написал статью по этому вопросу некоторое время назад, Кросс домен AJAX.

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

Access-Control-Allow-Origin: *

Это позволит кросс-домен Ajax. В PHP вы захотите изменить ответ следующим образом:

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

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

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

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

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

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

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

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

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

Header set Access-Control-Allow-Origin: http://my.origin.host

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

<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>

Это был первый вопрос / ответ, который выскочил для меня при попытке решить ту же проблему с помощью 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" );
}

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

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

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

Сначала выберите вспомогательные файлы > PhoneGap.файл plist

enter image description here

затем под "ExternalHosts"

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

enter image description here

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

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

Это может быть удобно для тех, кто нуждается в исключении как для "www", так и для "не-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');
 }

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

  1. создать ярлык браузера Chrome
  2. щелкните правой кнопкой мыши значок -> свойства -> ярлык -> объект

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

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

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

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

"permissions": [
    "https://itunes.apple.com/"
]

Если вы находитесь под apache, просто добавьте .htaccess файл в каталог с этим содержимым:

Header set Access-Control-Allow-Origin: *

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

Header set Access-Control-Allow-Methods: *

Это из-за политика того же происхождения. Смотрите больше на Mozilla Developer Network или Википедия.

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

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

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

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

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

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

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

посмотреть здесь для получения дополнительной информации о нем.

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

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

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security

В Ruby Синатра

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

для всех или

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 
 **Add this meta tag in your Webservice**


 header('Content-type: application/json');
 header('Access-Control-Allow-Origin: *');

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

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

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

чем когда вы должны ответить пойти с чем-то вроде этого:

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);

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