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


135

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

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

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


1
Неважно ... это работает сейчас, я даже не знаю, в чем была ошибка: S
— Th3lmuu90

8
Хотя и тонкий, http://wordicious.comэто другой домен, чем http://www.wordicious.com/, следовательно, ошибка. Кстати, если он работает сейчас и вернулся сам, вы, вероятно, должны удалить вопрос.
— acdcjunior

@acdcjunior Кажется, это ошибка, которая является проницательным наблюдением с вашей стороны. Если вы опубликуете это как ответ, я бы проголосовал за это.
— Валид Хан

5
Хорошо, что вопрос не был удален, иначе я бы его сегодня не увидел!
— ледяной воды

Ответы:


170

Использовать 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.


4
это показывает, что addheader не определен. Можете ли вы объяснить это?
— Vaisakh PC

9
Где я могу поставить эти строки?
— Дейв Уолли,

14
Где это должно быть добавлено?
— Алекс

1
В этом блоге говорится о Node.js и экспрессе. Не на стороне клиента, JavaScript. Кто-нибудь может подтвердить, если это работает?
— Сэм Итон

1
Я не думаю, что эта конфигурация может быть выполнена только на стороне клиента. Что касается того, где ее разместить, она будет на стороне сервера (вероятно, при создании ответа на запрос)
— Чираг Равиндра

145

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

Код 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неhttp://wordicious.com . (Может быть, разместить целевой URL относительно, например '/login.php', без домена).



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

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


62

Для сервера .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>

Еще лучшее решение. Спасибо
— ANJYR - KODEXPRESSION

Большое спасибо. Ты спас мне весь день.
— Пратик Гупта


1
@SyedAliTaqi вопрос php, поэтому ответ недооценен. однако это сработало и для меня :)
— Ахмад Чт

22

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

В запрошенном ресурсе отсутствует заголовок «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:

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

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


@NizarBsb ты сумасшедший, ты это знаешь !!!!! : D, спасибо большое, твой ответ спас мне жизнь
— Flash


7

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



}

3

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

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

Access-Control-Allow-Origin: *

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


3

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

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

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


это можно сделать на уровне конфигурации Apache или Nginx для домена. Например, если пользователь обращается к mysite.com (без www), а XHR запрашивает www.mysite.com, может ли директива htaccess или httpd.conf решить эту проблему?
— codecowboy

Конечно, ваше Front-End приложение должно работать как обратный прокси. например, для Apache вы должны установить mod_proxy и настроить свои правила, используя ProxyPassReverse ( httpd.apache.org/docs/current/mod/… ). Похоже, что те же функции доступны и в Nginx: wiki.nginx.org/LikeApache
— hzrari

2

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

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

добить - тебе тоже нужноheader("Access-Control-Allow-Credentials: true");
— Адам

1

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

Единственный способ, который работал для меня на Apache2, CentOS7, Larravel 5 и React
— Шакиба Мошири

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.