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

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

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

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

Ответ 1

Используйте addHeader Вместо использования метода setHeader,

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.

Ответ 2

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

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 - фактически тот же сервер/домен. Поэтому, чтобы исправить, введите цель и источник поровну: сделайте страницы/службы запроса кода Ajax на http://www.wordicious.com not http://wordicious.com. (Возможно, поместите целевой URL относительно, например '/login.php', без домена).



В более общем примечании:

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

Ответ 3

Для сервера .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 затем настройте на сервере web.config ниже

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

Ответ 4

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

Нет заголовка "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе. Поэтому 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:

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

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

Ответ 5

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

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

Ответ 6

вы должны поместить ключи/значения заголовков в ответ метода метода. например, если у вас есть ресурс в 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

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

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

Или прокси-сервер Apache Reverse...

Ответ 8

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

Access-Control-Allow-Credentials: true

Access-Control-Allow-Origin: *

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

Ответ 9

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

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

Ответ 10

Решено с помощью следующей записи в 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}]]

Ответ 11

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