Получать ответ от запроса ajax даже во время сбоя? [Дубликат]

Предполагая, что ваше имя исполняемого файла является exec и определено имя переменной x, и вы хотите передать значение x в качестве входного файла для исполняемого файла. Затем сделайте следующее:

$ echo $x > stdin && ./exec < stdin

это выполнит задание

1946
задан John 26 January 2018 в 21:16
поделиться

28 ответов

Если вы используете Node.js , попробуйте:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

Дополнительная информация: CORS на ExpressJS

1014
ответ дан Peter Mortensen 16 August 2018 в 10:57
поделиться
  • 1
    Ты прав. Я делаю запрос в другом домене, чем моя страница. API находится на сервере, и я запускаю запрос с localhost. Прежде чем я приму ответ, вы можете объяснить мне, что означает «выполнение запроса напрямую». ? POSTMAN не использует домен? – Mr Jedi 17 November 2013 в 21:54
  • 2
    Браузер не блокирует запрос. Единственными браузерами, которые напрямую связаны с запросами ajax для перекрестного происхождения, является IE7 или старше. Все браузеры, кроме IE7 и старше, реализуют спецификацию CORS (частично IE8 и IE9). Все, что вам нужно сделать, это отказаться от запросов CORS на вашем сервере API, вернув соответствующие заголовки на основе запроса. Вы должны прочитать концепцию CORS в mzl.la/VOFrSz . Почтальон отправляет запросы через XHR. Если вы не видите ту же проблему при использовании почтового корреспондента, это означает, что вы неосознанно не отправляете один и тот же запрос через почтальон. – Ray Nicholus 17 November 2013 в 22:01
  • 3
    @ MD.SahibBinMahboob Почтальон НЕ отправляет запрос & quot; из вашего java / python & quot; код. Он отправляет запрос непосредственно из браузера. XHR в расширениях Chrome работает немного по-другому, особенно если речь идет о запросах кросс-начала . – Ray Nicholus 17 November 2013 в 22:08
  • 4
    @yves это браузер, который фактически навязал правило. Поэтому запуск запроса из любых мест, а не из браузера, должен работать с файлом – MD. Sahib Bin Mahboob 5 August 2015 в 12:54
  • 5
    @SuhailGupta, если вы разрешаете происхождение на своем сервере, ему будет разрешен запрос, который на самом деле называется CORS. – MD. Sahib Bin Mahboob 29 February 2016 в 06:07
  • 6
    Я даю вам голос, потому что это именно то, что мне нужно. Но подумайте, что это плохая идея продвигать «*». пример, не объяснив, что он позволит любое соединение и не должно использоваться в производстве. Это объясняется ссылкой MDN developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS . – rob 9 June 2017 в 09:12
  • 7
    @rob спасибо за ваш комментарий. Вы правы, мы должны указать, какие из источников разрешено использовать ресурсы. Но в случае, если ресурсы используются в общественных целях, и мы не знаем потребителей, я думаю, что мы должны пойти с & quot; * & quot; если я не ошибаюсь. – Nguyen Tran 9 June 2017 в 11:08
  • 8
    Я использовал эту концепцию, и моя проблема решена в nodejs. благодаря – Deepak Bhatta 20 August 2017 в 07:29
  • 9
    app.use (функция (req, res, next) {res.setHeader ('Access-Control-Allow-Origin', '*'); res.setHeader ('Access-Control-Allow-Methods', 'GET, POST , OPTIONS, PUT, PATCH, DELETE '); res.setHeader (' Access-Control-Allow-Headers ',' X-Requested-With, content-type, Authorization '); res.setHeader (' Access-Control-Allow -Credentials ', true), если (' OPTIONS '=== req.method) {res.send (204);} else {next ();}}); – Ricky sharma 26 September 2017 в 10:05
  • 10
    Что касается опасности использования "Access-Control-Allow-Origin", "*", см. security.stackexchange.com/a/45677 . tldr: Спецификация W3 действительно рекомендует: ресурс, который является общедоступным, без проверок контроля доступа, всегда может безопасно возвращать заголовок Access-Control-Allow-Origin, чье значение имеет значение «*» – CODE-REaD 15 February 2018 в 17:45

Если я правильно понял, вы делаете XMLHttpRequest в другой домен, чем ваша страница. Таким образом, браузер блокирует его, поскольку он обычно разрешает запрос в том же самом источнике по соображениям безопасности. Вам нужно сделать что-то другое, если вы хотите выполнить кросс-доменный запрос. Учебник о том, как достичь этого, - Использование CORS .

Когда вы используете почтальон, они не ограничены этой политикой. Цитируется из Cross-Origin XMLHttpRequest :

. Обычные веб-страницы могут использовать объект XMLHttpRequest для отправки и получения данных с удаленных серверов, но они 'ограничивается одной и той же политикой происхождения. Расширения не так ограничены. Расширение может разговаривать с удаленными серверами за пределами его происхождения, если оно сначала запрашивает разрешения перекрестного происхождения.

1014
ответ дан Peter Mortensen 16 August 2018 в 10:57
поделиться
  • 1
    Ты прав. Я делаю запрос в другом домене, чем моя страница. API находится на сервере, и я запускаю запрос с localhost. Прежде чем я приму ответ, вы можете объяснить мне, что означает «выполнение запроса напрямую». ? POSTMAN не использует домен? – Mr Jedi 17 November 2013 в 21:54
  • 2
    Браузер не блокирует запрос. Единственными браузерами, которые напрямую связаны с запросами ajax для перекрестного происхождения, является IE7 или старше. Все браузеры, кроме IE7 и старше, реализуют спецификацию CORS (частично IE8 и IE9). Все, что вам нужно сделать, это отказаться от запросов CORS на вашем сервере API, вернув соответствующие заголовки на основе запроса. Вы должны прочитать концепцию CORS в mzl.la/VOFrSz . Почтальон отправляет запросы через XHR. Если вы не видите ту же проблему при использовании почтового корреспондента, это означает, что вы неосознанно не отправляете один и тот же запрос через почтальон. – Ray Nicholus 17 November 2013 в 22:01
  • 3
    @ MD.SahibBinMahboob Почтальон НЕ отправляет запрос & quot; из вашего java / python & quot; код. Он отправляет запрос непосредственно из браузера. XHR в расширениях Chrome работает немного по-другому, особенно если речь идет о запросах кросс-начала . – Ray Nicholus 17 November 2013 в 22:08
  • 4
    @yves это браузер, который фактически навязал правило. Поэтому запуск запроса из любых мест, а не из браузера, должен работать с файлом – MD. Sahib Bin Mahboob 5 August 2015 в 12:54
  • 5
    @SuhailGupta, если вы разрешаете происхождение на своем сервере, ему будет разрешен запрос, который на самом деле называется CORS. – MD. Sahib Bin Mahboob 29 February 2016 в 06:07

В Ajax есть междоменная проблема. Вы должны быть уверены, что получаете доступ к своим файлам на одном и том же пути http:// без www. (или доступ из http://www. и сообщение на тот же путь, в том числе www.), который браузер считает другим доменом при доступе через www., поэтому вы видите, где проблема. Вы отправляете в другой домен, и браузер блокирует поток из-за ошибки происхождения.

Если API не размещен на том же хосте, который вы запрашиваете, поток заблокирован, и вам нужно будет найти другой способ связи с API.

61
ответ дан Alin Razvan 16 August 2018 в 10:57
поделиться
  • 1
    yup, я был вынужден к этому в своем приложении phonegap, var app_url = location.protocol + '//' + location.host + '/ api /. проблема заключалась в сайте с www. добавленная ошибка принесет эту ошибку. – Sir Lojik 27 April 2015 в 12:26

Если вы НЕ хотите:

  1. Отключить веб-безопасность в Chrome
  2. Использовать JSONP
  3. Использовать сторонний сайт для повторной маршрутизации ваши запросы

, и вы уверены, что на вашем сервере включен CORS (проверьте CORS здесь: http://www.test-cors.org/ )

Затем вам необходимо передать исходный параметр с вашим запросом. Это начало ДОЛЖНО соответствовать тому, что ваш браузер отправляет с вашим запросом.

Вы можете увидеть его в действии здесь: http://www.wikibackpacker.com/app/detail/Campgrounds/3591

Функциональность редактирования отправляет GET & amp; POST-запрос в другой домен для извлечения данных. Я устанавливаю параметр origin, который решает проблему.

tldr: добавьте параметр «происхождение» к вашим вызовам, которые должны быть параметром Origin, который отправляет ваш браузер (вы не можете обманывать исходный параметр)

9
ответ дан CODE-REaD 16 August 2018 в 10:57
поделиться
  • 1
    Вы ссылаетесь на этот пример кода из main.min.js ?: t.post("https://wiki.wikinomad.com/api.php?origin=https://www.wikinomad.com", n, o).then(function(e) {.... Если да, то не правда ли, что этот способ указания происхождения требует, чтобы PHP служил из «бэкэнда», закодирована для его поддержки, и этот ответ не будет работать иначе? – CODE-REaD 15 February 2018 в 21:18

Поскольку $ .ajax ({type: "POST" - вызывает OPTIONS $ .post (- Calls POST

, оба являются разными почтовыми вызовами «POST» правильно, но когда мы называем это «OPTIONS»,

Для веб-служб c # - webapi

Пожалуйста, добавьте следующий код в свой файл web.config под тегом & lt; system.webServer & gt ;. Это будет работать

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>

Пожалуйста, убедитесь, что вы не ошибаетесь в вызове ajax

jQuery

$.ajax({
    url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    type: "POST", /* or type:"GET" or type:"PUT" */
    dataType: "json",
    data: {
    },
    success: function (result) {
        console.log(result);    
    },
    error: function () {
        console.log("error");
    }
});

Угловая проблема 4: см. http: //www.hubfly .com / blog / solutions / how-to-fix-angular-4-api-call-issues /

Примечание: если вы ищете загрузку контента с стороннего веб-сайта, тогда это не будет помогите вам. Вы можете попробовать следующий код, но не JavaScript.

System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");
41
ответ дан George Livingston 16 August 2018 в 10:57
поделиться
  • 1
    Эта конфигурация разрешила такую ​​же ошибку в Wordpress в Azure Services. Благодарю. – Andre Mesquita 22 May 2017 в 13:41
  • 2
    Я бы предложил использовать определенное значение начала, чтобы избежать запросов от внешних доменов. Например, вместо * используйте https://www.myotherdomain.com – pechar 9 June 2017 в 08:30

Если вы вернетесь в JSON в ответ, попробуйте использовать JSONP (обратите внимание на P в конце) для разговора между доменами:

$.ajax({
  type: "POST",
  dataType: 'jsonp',
  ...... etc ......

Узнайте больше о работе с JSONP здесь :

Появление JSONP - по существу, совместный скриптовый скриптовый скрипт - открыло дверь для мощных mashups содержание. Многие известные сайты предоставляют услуги JSONP, позволяя вам получить доступ к их контенту через предопределенный API.

313
ответ дан Hristiyan Dodov 16 August 2018 в 10:57
поделиться
  • 1
    – Gaizka Allende 15 May 2014 в 10:36
  • 2
    Помните, что jsonp не работает для контента POST. Больше обсуждений здесь . – Prabu Raja 13 November 2014 в 01:28
  • 3
    Как у вас так много голосов, когда вы не можете использовать jsonp с запросами POST?!?! – fatlog 7 August 2015 в 15:06
  • 4
    Когда вы используете JSONP, $ .ajax игнорирует type, поэтому всегда GET означает, что этот ответ всегда будет работать. – noob 6 October 2016 в 03:56
  • 5
    Похоже, что более 200 человек просто не получают его – cs01 23 November 2016 в 22:53
  • 6
    Также обратите внимание, что JSONP не является напрямую взаимозаменяемым с JSON. Вам нужен server , чтобы возвращать данные в формате JSONP. Простое изменение параметра dataType в настройках запроса AJAX не будет работать. – Rory McCrossan 7 September 2017 в 10:19

У меня возникла проблема с этим, когда я использовал AngularJS для доступа к моему API. Тот же запрос работал в SoapUI 5.0 и ColdFusion. У моего метода GET уже был заголовок Access-Control-Allow-Origin.

Я узнал, что AngularJS делает запрос пробных запросов. ColdFusion по умолчанию генерирует метод OPTIONS, но в нем не так много, эти заголовки специально. Ошибка возникла в ответ на этот вызов OPTIONS, а не на мой намеренный вызов GET. После того, как я добавил метод OPTIONS ниже в свой API, проблема была решена.

<cffunction name="optionsMethod" access="remote" output="false" returntype="any" httpmethod="OPTIONS" description="Method to respond to AngularJS trial call">
    <cfheader name="Access-Control-Allow-Headers" value="Content-Type,x-requested-with,Authorization,Access-Control-Allow-Origin"> 
    <cfheader name="Access-Control-Allow-Methods" value="GET,OPTIONS">      
    <cfheader name="Access-Control-Allow-Origin" value="*">      
    <cfheader name="Access-Control-Max-Age" value="360">        
</cffunction>
8
ответ дан Leonid Alzhin 16 August 2018 в 10:57
поделиться
  • 1
    Он не является угловым, что делает запрос OPTIONS, это браузер, основанный на запросе! – Narretz 12 October 2015 в 17:36
  • 2
    Narretz - вызов API через браузер не вызывает эту ошибку, и не вызывает дополнительных опций. При использовании углового используется. – Leonid Alzhin 17 November 2015 в 01:20
  • 3
    Наррец прав, он не связан с угловатым. Это связано с тем, как работает CORS. – Emile Bergeron 18 October 2016 в 15:23

Это очень просто решить, если вы используете PHP . Просто добавьте следующий скрипт в начале вашей страницы PHP, который обрабатывает запрос:

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

Внимание! Это содержит проблему безопасности для вашего файла PHP, которую он может вызывать злоумышленниками. вы должны использовать сеансы и файлы cookie для проверки подлинности, чтобы предотвратить ваш файл / службу от этой атаки. Ваш сервис уязвим для подделки запроса на межсайтовый доступ (CSRF).

Если вы используете Node-red , вы должны разрешить CORS в node-red/settings.js, не комментируя следующие строки:

// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
 origin: "*",
 methods: "GET,PUT,POST,DELETE"
},
185
ответ дан mplungjan 16 August 2018 в 10:57
поделиться
  • 1
    Вопрос касался не PHP вообще. – mknaf 10 December 2014 в 15:32
  • 2
    и это не безопасно – llazzaro 20 December 2014 в 20:25
  • 3
    Вы не должны отключать CORS, потому что вы не знаете, для чего это нужно. Это ужасный ответ. – meagar♦ 30 December 2014 в 07:12
  • 4
    Несмотря на то, что это может быть небезопасно, вопрос заключается не в безопасности, а в том, как выполнить задачу. Это один из вариантов, который разработчик должен выбрать при работе с междоменными запросами AJAX. Это помогло мне решить проблему, и для моего приложения мне все равно, откуда взялись данные. Я дезинфицирую все входные данные с PHP в целевом домене, поэтому, если кто-то хочет опубликовать некоторый барахло, попробуйте. Главное здесь, что междоменный AJAX может быть разрешен из целевого домена. +1 для ответа. – ZurabWeb 26 February 2015 в 17:37
  • 5
    Хотя я согласен с общим сообщением, которое Пьеро дает, что речь идет не только о безопасности, но и о безопасности. Я думаю, что это должно было хотя бы сказать что-то вроде «Это вообще плохо! Не делай этого, если не знаешь, что делаешь! Вот еще документация по этому поводу: ... & quot ;, и, возможно, кратко объясните, почему. Я бы не хотел, чтобы кто-то пришел сюда и просто подумал. «О, я могу просто добавить / настроить этот заголовок, и я хорошо!». и не знаю полных последствий. Я имею в виду, что от них зависит исследование и все, но все же. – Thomas F. 15 October 2015 в 14:55

Это не исправление для производства или когда приложение должно быть показано клиенту, это полезно только в том случае, если разработка UI и Backend на разных серверах и в процессе производства они фактически находятся на одном сервере. Например: при разработке пользовательского интерфейса для любого приложения, если есть необходимость протестировать его локально, указывая на сервер бэкэнд, в этом случае это идеальное решение. Для производственного исправления заголовки CORS должны быть добавлены на серверный сервер, чтобы разрешить доступ к кросс-контенту.

Легкий способ - просто добавить расширение в google chrome чтобы разрешить доступ с помощью CORS.

( https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=ru-RU )

Просто включите это расширение, когда вы хотите разрешить доступ к запросу заголовка «access-control-allow-origin».

Или

В Windows вставьте эта команда в окне запуска

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

откроет новый браузер Chrome, который разрешит доступ к запросу заголовка «access-control-allow-origin».

451
ответ дан shruti 16 August 2018 в 10:57
поделиться
  • 1
    Это здорово, но клиенты не могут попросить запустить chrome таким образом, чтобы обеспечить внутреннее требование для вызова webservice. – Taersious 24 September 2015 в 17:55
  • 2
    это не должно приниматься как ответ, устанавливая сторонний плагин, чтобы исправить ваше приложение, а не понимать CORS и исправлять ваше приложение, как другие люди будут использовать ваш api? вы сделаете все, чтобы установить этот плагин – James Kirkby 28 April 2016 в 11:10
  • 3
    Я установил это расширение и сделал запрос, чем проверил запрос в скрипаче, было указано следующее - & gt; Происхождение: evil.com . Похоже, это расширение меняет Origin на evil.com – wagwanJahMan 10 May 2016 в 12:54
  • 4
    Это расширение работает как шарм. Но что они делают внутри? Есть ли способ сделать то же самое в Javascript или JQuery, а не использовать плагин? – sms 11 May 2016 в 11:07
  • 5
    Я думаю, что это действительно отличный ответ , если вам не нужно постоянное исправление или вам нужно временно отключить CORS. Это то, что мне было нужно, и это решение отлично поработало. Очевидно, это никогда не может считаться постоянным решением. – jtcotton63 24 March 2017 в 01:44

Попробуйте XDomain ,

Сводка: Чистая альтернатива JavaScript / CORS для JavaScript. Не требуется настройка сервера - просто добавьте proxy.html в домене, с которым вы хотите общаться. Эта библиотека использует XHook для захвата всех XHR , поэтому XDomain должен работать совместно с любой библиотекой.

22
ответ дан ygormutti 16 August 2018 в 10:57
поделиться

Я хочу, чтобы кто-то поделился этим сайтом со мной давно http://cors.io/ , он бы сэкономил массу времени по сравнению со строительством и полагался на мой собственный прокси. Однако, когда вы переходите к производству, ваш собственный прокси-сервер является лучшим выбором, поскольку вы все еще контролируете все аспекты ваших данных.

Все, что вам нужно:

https://cors.io/?http://HTTP_YOUR_LINK_HERE

144
ответ дан yoshyosh 16 August 2018 в 10:57
поделиться
  • 1
    Каковы недостатки этого? Эти ребята перехватывают мои данные? – Sebastialonso 21 August 2015 в 16:33
  • 2
    cors.io/?u=HTTP_YOUR_LINK_HERE (небольшая коррекция) – jkpd 17 September 2015 в 13:05
  • 3
    Я не думаю, что отправка ваших данных по стороннему прокси - хорошая идея – Daniel Alexandrov 16 October 2015 в 14:07
  • 4
    Один недостаток - они иногда перегружены, как сейчас. This application is temporarily over its serving quota. Please try again later. – Daniel Hickman 20 February 2016 в 08:52
  • 5
    попробуйте также https://crossorigin.me/http://example.com – KingRider 15 April 2016 в 15:05

У меня была следующая конфигурация, приводящая к той же ошибке при запросе ответов с сервера.

Серверная сторона: SparkJava - > предоставляет клиентскую часть REST-API: ExtJs6 -> обеспечивает рендеринг браузера

На стороне сервера мне пришлось добавить это к ответу:

Spark.get("/someRestCallToSpark", (req, res) -> {
    res.header("Access-Control-Allow-Origin", "*"); //important, otherwise its not working 
    return "some text";
 });

На стороне клиента мне пришлось добавить к запросу:

Ext.Ajax.request({
    url: "http://localhost:4567/someRestCallToSpark",
    useDefaultXhrHeader: false, //important, otherwise its not working
    success: function(response, opts) {console.log("success")},
    failure: function(response, opts) {console.log("failure")}
});
8
ответ дан Ani Menon 16 August 2018 в 10:57
поделиться
  • 1
    Имела та же архитектура, поэтому одна и та же проблема, и это ее решает. – Fafhrd 7 October 2015 в 19:03
  • 2
    Не рекомендуется отправлять запросы из любого домена. Вы должны ограничить его только доверенным доменом. – MD. Sahib Bin Mahboob 15 January 2016 в 06:36
  • 3
    Если вы являетесь хозяином обоих доменов, общепринятой практикой является включение этого типа запросов. – kiltek 25 May 2016 в 08:42

В моем случае я использовал приложение JEE7 JAX-RS, и следующие трюки отлично работали для меня:

@GET
    @Path("{id}")
    public Response getEventData(@PathParam("id") String id) throws FileNotFoundException {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("/eventdata/" + id + ".json");
        JsonReader jsonReader = Json.createReader(inputStream);
        return Response.ok(jsonReader.readObject()).header("Access-Control-Allow-Origin", "*").build();
    }
5
ответ дан Bhuwan Gautam 16 August 2018 в 10:57
поделиться

На основе ответа shruti я создал ярлык браузера Chrome с необходимыми аргументами:

8
ответ дан Community 16 August 2018 в 10:57
поделиться
  • 1
    Отлично. Теперь мне нужно обратиться к моим 100 000 пользователям и отключить их безопасность в Интернете на хроме. – Ganesh Krishnan 6 July 2016 в 06:08
  • 2
    @GaneshKrishnan Вопрос, кажется, разработчик, и его вопрос (на мой взгляд) кажется для целей развития, поскольку моя проблема была. И да, если вы хотите взломать своих пользователей, обойти их и отключить их безопасность в Интернете на Chrome :) – Mohammad 6 July 2016 в 18:37

Я успешно смог решить (в моем случае для шрифтов) с помощью htaccess, но, очевидно, OP задает немного разные. Но вы можете использовать шаблон FileMatch и добавить любое расширение, чтобы он не выдавал ошибку cros.

<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

https://httpd.apache.org/docs/2.4/mod /core.html#filesmatch

4
ответ дан Danish 16 August 2018 в 10:57
поделиться

Большинство этих ответов говорят пользователям, как добавить заголовки CORS на сервер, который они контролируют.

Однако, если вам нужны данные с сервера, который вы не контролируете на веб-странице, одним из решений является создание тег сценария на вашей странице, установите атрибут src в конечную точку api, у которой нет заголовков CORS, затем загрузите эти данные на страницу:

window.handleData = function(data) {
  console.log(data)
};

var script = document.createElement('script');
script.setAttribute('src','https://some.api/without/cors/headers.com&callback=handleData');
document.body.appendChild(script);
2
ответ дан duhaime 16 August 2018 в 10:57
поделиться
  • 1
    Отличный ответ, но если скрипт не в правильном формате, то вы не можете достичь его кода (script.text = empty). Что делать в этом случае? Как достичь своего кода? – Angel T 8 February 2018 в 07:52
  • 2
    Как предотвратить выполнение скрипта (возможно, как комментарий все это)? – Angel T 8 February 2018 в 08:16
  • 3
    И еще одна интересная вещь: только IE11 с Enabled и «Доступ к источникам данных через домены». может получить доступ к междоменному (без необходимости управления сервером для модификации Origin !. Все остальные основные браузеры не могут – Angel T 8 February 2018 в 09:14

На моем веб-сайте (на основе .NET) я только что добавил это:

<system.webServer>
 <httpProtocol>  
    <customHeaders>  
     <add name="Access-Control-Allow-Origin" value="*" />  
     <add name="Access-Control-Allow-Headers" value="Content-Type" />  
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />  
    </customHeaders>  
  </httpProtocol>         
</system.webServer>

Большое спасибо этому видео .

1
ответ дан FrenkyB 16 August 2018 в 10:57
поделиться
  • 1
    В вопросе говорится: «Я знаю, что API или удаленный ресурс должен устанавливать заголовок, но почему он работал, когда я сделал запрос через расширение« Почта »Chrome? & Quot ;. Это не ответ на заданный вопрос. – Quentin 13 September 2017 в 08:40

Много раз это происходит со мной от javascript к моему php api, потому что одна из нескольких причин. Я забыл поставить <?php header('Access-Control-Allow-Origin: *'); ? один. Это полезно для доступа к перекрестным доменам. Другая причина заключается в том, что в jQuery ajax-запросе я указываю конкретный тип данных и возвращаю другой тип данных, поэтому он выдает ошибку.

Последней и самой известной причиной этой ошибки является ошибка синтаксического анализа на запрашиваемой странице. Если вы нажмете URL-адрес этой страницы в своем браузере, более вероятно, вы увидите ошибку синтаксического анализа, и у вас будет номер строки для решения проблемы.

Надеюсь, это поможет кому-то. Мне потребовалось некоторое время, чтобы отладить это, и я бы хотел, чтобы у меня был контрольный список вещей для проверки.

3
ответ дан Garrett Tacoronte 16 August 2018 в 10:57
поделиться

Возможно, это немного сложнее, но вы можете использовать веб-сервер для маршрутизации запроса. С nodejs вы не имеете этой проблемы. Я не эксперт в узле js. Поэтому я не знаю, является ли это чистым кодом.

Но это работает для меня

Вот немного примера:

NODE JS

var rp = require('request-promise');
var express = require('express'),
    app = express(),
    port = process.env.PORT || 3000;
var options = {
    method: 'POST',
    uri: 'http://api.posttestserver.com/post',
    body: {
        some: 'payload'
    },
    json: true // Automatically stringifies the body to JSON
};
app.get('/', function (req, res) {
        rp(options)
        .then(function (parsedBody) {
            res.send(parsedBody)
        })
        .catch(function (err) {
            res.send(err)
        });
});
app.listen(port);

JS

axios.get("http://localhost:3000/").then((res)=>{
    console.log('================res====================');
    console.log(res);
    console.log('====================================');
})
1
ответ дан KT Works 16 August 2018 в 10:57
поделиться

Популярный вопрос - Еще одна вещь, на которую нужно смотреть, если вы читали это далеко, и ничего больше не помогло. Если у вас есть CDN, например Akamai, Limelight или подобное, вы можете проверить ключ кеша, который у вас есть для URI ресурса. Если он не содержит значение заголовка Origin, вы можете вернуть ответ в кешированный запрос по другому источнику. Мы просто потратили полдня на отладку. Конфигурация CDN была обновлена, чтобы включать только значение Origin для нескольких выбранных доменов, которые являются нашими, и установить для него значение null для всех остальных. Это похоже на работу и позволяет браузерам из наших известных доменов просматривать наши ресурсы. Конечно, все остальные ответы являются предпосылками для получения здесь, но если CDN является первым переходом из вашего браузера, это то, что нужно рассмотреть.

В нашем случае мы могли видеть, что некоторые запросы поступают к нашей службе, но не к тому объему, который отправлял сайт. Это указывало нам на CDN. Мы смогли вернуться и посмотреть, что исходный запрос был подан с помощью прямого запроса, а не части вызова AJAX браузера, и заголовок ответа Access-Control-Allow-Origin не был включен. По-видимому, CDN кэшировал это значение. Конфигурация конфигурации CDA Akamai, чтобы рассмотреть значение заголовка запроса Origin как часть совпадения, похоже, заставила его работать для нас.

3
ответ дан No Refunds No Returns 16 August 2018 в 10:57
поделиться
  • 1
    В вашем случае, не отправил ли ответный заголовок Vary: Origin, тот же эффект? [Д0] stackoverflow.com/questions/46063304/… – sideshowbarker 7 September 2017 в 21:19
  • 2
    Да, но мы этого не делаем. Услуга, открытая миру, может быть DOS'а посредством взлома кэша, отправив фиктивные значения. Akamai оказывает некоторую помощь в этой области, чтобы уменьшить воздействие DOS. Я хочу сказать, что вы можете делать все перечисленное и все еще иметь проблемы из-за кеширования. – No Refunds No Returns 7 September 2017 в 22:42
  • 3
    В вопросе говорится: «Я знаю, что API или удаленный ресурс должен устанавливать заголовок, но почему он работал, когда я сделал запрос через расширение« Почта »Chrome? & Quot ;. Это не ответ на заданный вопрос. – Quentin 13 September 2017 в 08:39
  • 4
    @Quentin Ты так прав! однако это №1 для многих поисков по этой теме, есть уже множество ответов, которые отличаются от точного вопроса, но предоставляют полезную информацию. Это было то, что мы обнаружили 7 сентября после исчерпания всех потоков. Я ценю ваш downvote. Будущие читатели также смогут взвесить, действительно ли это «не ответ», было полезно для голосования, возможно, даже по-другому от вас. Есть, по крайней мере, еще один человек, который уже публично не согласился с вашим мнением. Будет интересно посмотреть, как идет голосование отсюда ........ – No Refunds No Returns 13 September 2017 в 14:54
  • 5
    +4 / -1 Еще раз спасибо массам. – No Refunds No Returns 26 January 2018 в 17:26
  • 6
    – No Refunds No Returns 21 August 2018 в 17:42

Для Opera (он работает так же, как Chrome), я запустил браузер с помощью этой команды:

opera --user-data-dir="~/Downloads/opera-session" --disable-web-security

Проблема решена! Теперь я могу работать с локальным HTML-файлом (на моем жестком диске) и вызывать запросы Ajax для удаленного источника в том же файле.

Примечание 1: Вы можете указать любую папку в вашем домашнем каталоге как -user-data-dir.

Примечание 2: Протестировано на Debian & nbsp; 8 (Jessie) / Opera 39

Когда вы начинаете нормально (без параметров выше), тот же запрос попадает в блок кода ошибки.

7
ответ дан Peter Mortensen 16 August 2018 в 10:57
поделиться
  • 1
    Это похоже на ошибку, которая может произойти в любом приложении структуры сущности, если вы не завершите запрос. На самом деле это не связано с вопросом CORS или OP. – Gary 4 January 2016 в 22:20
  • 2
    Это может быть очень не связано с CORS, но это порождает ошибку, которая звучит так, как будто она имеет какое-то отношение к CORS; следовательно, мой ответ. – Loyalar 17 February 2016 в 07:52
  • 3
    У меня есть сайт IIS, который является локальным, на котором размещается мой API. У меня есть внешний сайт, доступ к которому осуществляется за пределами локальной сети. Я пытаюсь выполнить API с внешнего сайта, у меня есть CORS для внешнего сайта (например, [EnableCors(origins: "http://websitelink.com", headers: "*", methods: "*")], но он не работает. Любая идея? forums.asp.net/p/2117965/… / g0] – Si8 24 March 2017 в 15:12
  • 4
    но через секунды ... все остальные коды запускаются, а затем инициализируются. – saber tabatabaee yazdi 8 June 2017 в 16:16
  • 5
    В вопросе говорится: «Я знаю, что API или удаленный ресурс должен устанавливать заголовок, но почему он работал, когда я сделал запрос через расширение« Почта »Chrome? & Quot ;. Это не ответ на заданный вопрос. – Quentin 13 September 2017 в 08:40
  • 6
  • 7
    Это большой риск для безопасности! – Stephan Weinhold 9 June 2018 в 20:14
  • 8
    @ stephan-weinhold в случае, если вы действительно будете дезинфицировать параметры URL. будет ли это еще угрозой безопасности? Зачем? – mwallisch 13 June 2018 в 11:15

В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Поэтому исходный адрес https://sx.xyz.com 'не разрешен.

Я столкнулся с аналогичной проблемой с Exchange Domain Exchange в ответе Ajax как ошибка не определено. Но ответ в заголовке был кодом состояния: 200 OK

Failed to load https://www.Domain.in/index.php?route=api/synchronization/checkapikey:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'https://sx.xyz.in' is therefore not allowed access.

Решение для его обхода: в моем случае это было вызов функции checkapikey () через Ajax в другой домен и получение ответа с данные, на которые был сделан вызов:

if (($this->request->server['REQUEST_METHOD'] == 'POST') && isset($this->request->server['HTTP_ORIGIN'])) {

        $this->response->addHeader('Access-Control-Allow-Origin: ' . $this->request->server['HTTP_ORIGIN']);
        $this->response->addHeader('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
        $this->response->addHeader('Access-Control-Max-Age: 1000');
        $this->response->addHeader('Access-Control-Allow-Credentials: true');
        $this->response->addHeader('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

        $headers = getallheaders();
...
}
7
ответ дан Peter Mortensen 16 August 2018 в 10:57
поделиться
  • 1
    Это похоже на ошибку, которая может произойти в любом приложении структуры сущности, если вы не завершите запрос. На самом деле это не связано с вопросом CORS или OP. – Gary 4 January 2016 в 22:20
  • 2
    Это может быть очень не связано с CORS, но это порождает ошибку, которая звучит так, как будто она имеет какое-то отношение к CORS; следовательно, мой ответ. – Loyalar 17 February 2016 в 07:52
  • 3
    У меня есть сайт IIS, который является локальным, на котором размещается мой API. У меня есть внешний сайт, доступ к которому осуществляется за пределами локальной сети. Я пытаюсь выполнить API с внешнего сайта, у меня есть CORS для внешнего сайта (например, [EnableCors(origins: "http://websitelink.com", headers: "*", methods: "*")], но он не работает. Любая идея? forums.asp.net/p/2117965/… / g0] – Si8 24 March 2017 в 15:12
  • 4
    но через секунды ... все остальные коды запускаются, а затем инициализируются. – saber tabatabaee yazdi 8 June 2017 в 16:16
  • 5
    В вопросе говорится: «Я знаю, что API или удаленный ресурс должен устанавливать заголовок, но почему он работал, когда я сделал запрос через расширение« Почта »Chrome? & Quot ;. Это не ответ на заданный вопрос. – Quentin 13 September 2017 в 08:40
  • 6
  • 7
    Это большой риск для безопасности! – Stephan Weinhold 9 June 2018 в 20:14
  • 8
    @ stephan-weinhold в случае, если вы действительно будете дезинфицировать параметры URL. будет ли это еще угрозой безопасности? Зачем? – mwallisch 13 June 2018 в 11:15
7
ответ дан Peter Mortensen 6 September 2018 в 05:21
поделиться
7
ответ дан Peter Mortensen 6 September 2018 в 05:21
поделиться
7
ответ дан Peter Mortensen 29 October 2018 в 11:54
поделиться
7
ответ дан Peter Mortensen 29 October 2018 в 11:54
поделиться
7
ответ дан Peter Mortensen 29 October 2018 в 11:54
поделиться
7
ответ дан Peter Mortensen 29 October 2018 в 11:54
поделиться
Другие вопросы по тегам:

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