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

135

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

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

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

Th3lmuu90
источник
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к целевому домену . Чтобы добавить его, зависит, конечно, от сервера / языка за этим адресом. Иногда переменная конфигурации в инструменте сделает свое дело. В других случаях вам придется добавлять заголовки через код самостоятельно.

acdcjunior
источник
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>
Naga
источник
Еще лучшее решение. Спасибо
ANJYR - KODEXPRESSION
Большое спасибо. Ты спас мне весь день.
Пратик Гупта
Ubiquitous Developers
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
10

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

<?php header('Access-Control-Allow-Origin: *'); ?>
Shady Sherif
источник
5
Определенно не безопасно.
обратный звонок
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");
    }



}
i-systech.com
источник
3

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

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

Access-Control-Allow-Origin: *

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

Piusha
источник
3

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

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

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

hzrari
источник
это можно сделать на уровне конфигурации 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}]]
Sandeep540
источник
Единственный способ, который работал для меня на Apache2, CentOS7, Larravel 5 и React
Шакиба Мошири