Ajax перенаправляет на внешнюю ссылку из WordPress No 'Access-Control-Allow-Origin' [duplicate]

XmlDocument для чтения XML из строки или из файла.

  XmlDocument doc = new XmlDocument ();  doc.Load ( "C: \\ temp.xml");   

или

  doc.LoadXml ("& lt; xml & gt; something & lt; / xml & gt;");   

, затем найдите узел под ним, например:

  XmlNode node = doc.DocumentElement.SelectSingleNode ("/ book / title");   

или

  foreach (узел XmlNode в doc.DocumentElement.ChildNodes) {строка text = node.InnerText;  // или зацикливаем на его дочерние элементы}  

, затем читаем текст внутри этого узла, как это

  string text = node.InnerText;   

или прочитать атрибут

  string attr = node.Attributes ["theattributename"] ?. InnerText  

Всегда проверяйте значение null на атрибутах ["something"], поскольку оно будет null, если атрибут не существует.

129
задан acdcjunior 15 December 2014 в 18:05
поделиться

11 ответов

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

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 никогда не была настроена для представления (g2) Решение:

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

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

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

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

142
ответ дан acdcjunior 15 August 2018 в 17:10
поделиться

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

0
ответ дан Belter 15 August 2018 в 17:10
поделиться

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

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

167
ответ дан Jay Patel 15 August 2018 в 17:10
поделиться
  • 1
    Я поражен, почему этот ответ не получает upvote – Just code 22 July 2014 в 17:03
  • 2
    он показывает, что addheader не определен. Не могли бы вы объяснить это? – Vaisakh Pc 21 October 2014 в 08:42
  • 3
    Где я могу поставить эти строки? – DaveWalley 24 November 2014 в 17:52
  • 4
    Где это следует добавить? – undroid 29 December 2014 в 13:11
  • 5
    Это сообщение в блоге говорит об Node.js и выражает. Не клиентский javascript. может ли кто-нибудь подтвердить, работает ли это? – Sam Eaton 20 April 2015 в 23:01

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

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

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

3
ответ дан Max O. 15 August 2018 в 17:10
поделиться
  • 1
    это можно сделать на уровне конфигурации Apache или Nginx для домена. например, если пользователь обращается к mysite.com (нет www), а XHR запрашивает www.mysite.com, может ли решение htaccess или httpd.conf разрешить это? – codecowboy 2 April 2014 в 12:57
  • 2
    Конечно, ваше приложение Front-End должно вести себя как обратный прокси. например, для Apache, вам необходимо установить mod_proxy и настроить свои правила с помощью ProxyPassReverse ( httpd.apache.org/docs/current/mod/… ). Эти же функции, по-видимому, доступны и для Nginx: wiki.nginx.org/LikeApache – hzrari 2 April 2014 в 16:24

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

Нет заголовка «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-интерфейсом 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));

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

21
ответ дан Nizar B. 15 August 2018 в 17:10
поделиться
  • 1
    Вы - гений! – Maria 29 June 2016 в 11:32
  • 2
    @NizarBsb ты сумасшедший, ты знаешь это !!!!! : D, спасибо, что ваш ответ спас мою жизнь – Flash 26 October 2017 в 13:16

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

Access-Control-Allow-Credentials: true

Access-Control-Allow-Origin: *

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

3
ответ дан Piusha 15 August 2018 в 17:10
поделиться

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

header("Access-Control-Allow-Origin: http://localhost:9000");
1
ответ дан Sam 15 August 2018 в 17:10
поделиться
  • 1
    для завершения - вам также нужно header("Access-Control-Allow-Credentials: true"); – Adam 12 May 2016 в 20:12

Решено с помощью следующей записи в 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 15 August 2018 в 17:10
поделиться

Вам нужно добавить это при запуске вашей php-страницы «login.php»

<?php header('Access-Control-Allow-Origin: *'); ?>
9
ответ дан shady sherif 15 August 2018 в 17:10
поделиться

Для .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>
61
ответ дан Steve 15 August 2018 в 17:10
поделиться
  • 1
    Это сработало отлично. Благодаря! – saiyancoder 12 June 2014 в 10:10
  • 2
    почему этот ответ недооценивается? Он работает отлично. – Syed Ali Taqi 26 August 2015 в 09:37
  • 3
    Еще лучшее решение. благодаря – Anjyr 18 November 2015 в 13:09
  • 4
    Большое спасибо. Ты спасал весь мой день. – Prateek-Systematix 22 August 2016 в 11:00
  • 5
    @SyedAliTaqi вопрос php, поэтому ответ недооценен. однако это сработало и для меня :) – Ahmad Th 10 September 2017 в 16:05
Другие вопросы по тегам:

Похожие вопросы: