it-swarm.com.ru

В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Происхождение «...» поэтому не допускается

Я использую .htaccess, чтобы переписать URL-адреса, и я использовал HTML-тег базы, чтобы заставить его работать.

Теперь, когда я пытаюсь сделать запрос AJAX, я получаю следующую ошибку:

XMLHttpRequest не может загрузить http://www.wordicious.com/login.php . В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение ' http://wordicious.com ', следовательно, доступ запрещен.

134
Th3lmuu90

Используйте addHeaderNAME _ вместо использования setHeaderNAME _,

response.addHeader("Access-Control-Allow-Origin", "*");

* в указанной выше строке разрешит access to all domains.


Для разрешения access to specific domain only:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

Проверьте это blog post .

170
Jay Patel

Почему возникает ошибка:

Код JavaScript ограничен политика того же происхождения , то есть со страницы на www.example.com вы можете только (AJAX) запрашивать сервисы, расположенные в , точно тот же домен, в этом случае, точно www.example.com ( нет example.com - без www - или whatever.example.com).

В вашем случае ваш Ajax-код пытается получить доступ к службе в http://wordicious.com со страницы, расположенной по адресу http://www.wordicious.com.

Хотя они очень похожи, они не являются одним доменом. И если они не находятся в одном домене, запрос будет успешным только в том случае, если в расположении цели содержится заголовок Access-Control-Allow-Origin.

Поскольку ваша страница/служба в http://wordicious.com никогда не была настроена для представления такого заголовка, отображается это сообщение об ошибке.

Решение:

Как уже говорилось, исходный (где находится страница с JavaScript) и целевой (где пытается достичь JavaScript) домены должны быть точными одинаковыми. ,.

Ваш случай кажется опечаткой. Похоже, что http://wordicious.com и http://www.wordicious.com на самом деле один и тот же сервер/домен. Таким образом, чтобы исправить, напечатайте target и Origin одинаково: сделайте так, чтобы страницы/службы Ajax-кода запрашивали http://www.wordicious.com, а не http://wordicious.com. (Возможно, поместите целевой URL относительно, например, '/login.php', без домена).



На более общей ноте:

Если проблема не является опечаткой, подобной той, которая возникает в этом вопросе, решение было бы добавить Access-Control-Allow-Origin в целевой домен . Чтобы добавить его, зависит, конечно, от сервера/языка за этим адресом. Иногда переменная конфигурации в инструменте сделает свое дело. В других случаях вам придется добавлять заголовки через код самостоятельно.

145
acdcjunior

Для сервера .NET это можно настроить в файле web.config, как показано ниже.

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

Например, скажем, если домен сервера http://live.makemypublication.com , а клиент http://www.makemypublication.com , то настройте его в сети сервера. .config как показано ниже

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>
61
Naga

Если вы получаете это сообщение об ошибке из браузера:

В запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Происхождение "…" поэтому не допускается

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

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

Что вам действительно нужно сделать, особенно если вы используете JavaScript только для выполнения Ajax-запроса, это внутренний прокси-сервер, который принимает ваш запрос и отправляет его на удаленный сервер.

Сначала в вашем JavaScript сделайте Ajax-вызов на ваш собственный сервер, что-то вроде:

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

Затем создайте простой файл PHP с именем proxy.php, чтобы обернуть данные POST и ​​добавить их на удаленный URL-сервер в качестве параметров. Я приведу пример того, как обойти эту проблему с помощью API поиска Expedia Hotel:

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

При выполнении:

 echo json_encode(file_get_contents($url));

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

21
Nizar B.

Вы должны добавить это в начале вашей php-страницы "login.php"

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

вы должны поместить ключи/значения заголовков в ответ опции метода. например, если у вас есть ресурс по адресу http://mydomain.com/myresource , то в коде своего сервера вы пишете

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}
7
i-systech.com

Обходной путь - использовать обратный прокси, работающий на вашем "исходном" хосте и перенаправляющий на целевой сервер, такой как Fiddler:

Ссылка здесь: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

Или обратный прокси-сервер Apache ...

3
hzrari

В основном измените ответ заголовка API, добавив следующие дополнительные параметры.

Access-Control-Allow-Credentials: правда

Access-Control-Allow-Origin: *

Но это не очень хорошее решение, когда речь заходит о безопасности.

3
Piusha

Добавьте это к вам PHP файл или основной контроллер

header("Access-Control-Allow-Origin: http://localhost:9000");
1
Sam

Решено с помощью записи ниже в httpd.conf

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_Origin:%{HTTP:Origin}]]
1
Sandeep540

Я сталкиваюсь с этой проблемой, когда использую Angular для публикации записи в Django REST бэкэнде. Иногда нет особой причины этой проблемы. Внимательно проверьте сообщение об ошибке вашего Django, вы найдете решение.

0
Belter