Политика Vue Axios CORS: нет «Access-Control-Allow-Origin»

Я создаю приложение, используя vue и codeigniter, но у меня проблема, когда я пытаюсь получить API, я получаю эту ошибку на консоли

Access to XMLHttpRequest at 'http://localhost:8888/project/login' 
from origin 'http://localhost:8080' has been blocked by CORS policy: 
Request header field access-control-allow-origin is not allowed 
by Access-Control-Allow-Headers in preflight response.

Я пробовал это на внешнем интерфейсе (main.js)

axios.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

и это на бэкэнде (контроллере)

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

и метод входа в систему vue

this.axios.post('http://localhost:8888/project/login', this.data, {
   headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET, POST, PATCH, PUT, DELETE, OPTIONS",
          "Access-Control-Allow-Headers": "Origin, Content-Type, X-Auth-Token"
        }
      }).then(res => {
        console.info(res);
      }).catch(err => {
        console.info(err.response);
      });

Я искал и пробовал в stackoverflow, но не работает, как я могу это решить? большое вам спасибо за вашу помощь

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
47
0
178 184
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

CORS — это сервер, сообщающий клиенту, какие HTTP-запросы ему разрешено делать. Каждый раз, когда вы видите заголовок Access-Control-Allow-*, он должен быть отправлен сервером, а НЕ клиентом. Сервер «разрешает» клиенту отправлять определенные заголовки. Клиенту не имеет смысла давать себе разрешение. Поэтому удалите эти заголовки из кода внешнего интерфейса.

axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*';

this.axios.post('http://localhost:8888/project/login', this.data, {
   headers: {
          // remove headers
        }
      }).then(res => {
        console.info(res);
      }).catch(err => {
        console.info(err.response);
      });

Например, представьте, что ваш сервер установил этот заголовок cors.

header("Access-Control-Allow-Methods: GET");

Это означает, что клиенту из другого источника разрешено отправлять только запросы GET, поэтому axios.get сработает, axios.post сработает, axios.delete сработает и т. д.

ошибка.. я получил.. CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

aswzen 13.07.2020 09:30

Спасибо, +1 за указание, что клиентские запросы не должны иметь этих заголовков. Я не знал этого до сих пор.

J. Unkrass 20.04.2021 11:53

в моем случае curl && postman работает, но не работает с vue axios.post

Access to XMLHttpRequest at 'http://%%%%:9200/lead/_search' from origin 'http://%%%%.local' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

Итак, проблема на стороне vue, а не на сервере!

Ответ сервера содержит заголовок «access-control-allow-origin: *».

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

Taras Kryvko 26.03.2020 18:15

Это может произойти, когда вы пытаетесь вызвать другой хост для ex- Ваше приложение Vue работает на локальном хосте: 8080, но ваш серверный API работает на http://локальный:8888. В этой ситуации запрос axios ищет этот localhost:8080/project/login вместо этого http://локальный:8888/проект/логин

Чтобы решить эту проблему, вам нужно создать прокси в вашем приложении vue.

Следуйте этой инструкции. Создайте файл js vue.config.js или webpack.config.js, если у вас его еще нет в корневой папке.

затем включите ниже

module.exports = {
 devServer: {
     proxy: 'https://localhost:8888'
 } }

Если вам нужно несколько бэкэндов, используйте ниже

module.exports = {
devServer: {
    proxy: {
        '/V1': {
            target: 'http://localhost:8888',
            changeOrigin: true,
            pathRewrite: {
                '^/V1': ''
            }
        },
        '/V2': {
            target: 'https://loclhost:4437',
            changeOrigin: true,
            pathRewrite: {
                '^/V2': ''
            }
        },

    }
}

Если вы выберете второй перед конечной точкой, используйте V1 или V2. ex - ваша конечная точка /project/login, прежде чем использовать V1/project/login или V2/project/login согласно хозяину

Спасибо! Это отлично работает. Я добавил devServer в свой файл vue.config.js внутри объекта configureWebpack (который находится на том же уровне, что и publicPath).

JCarlosR 15.08.2020 20:21

Привет, я добавил devServer, но когда я создаю проект, появляется ошибка cors. И запрос использует http вместо https.

David Chan 23.11.2020 07:30

Не могли бы вы добавить несколько примеров запросов AJAX, чтобы я мог немного лучше понять вариант использования с префиксами /V1 и /V2?

Jonathan 13.10.2021 23:41

Dev Proxy — ваше решение

С помощью DevProxy вы определяете конкретный путь или подстановочный знак (не статический), на который Node (на сервере работает vue-cli dev server) будет направлять трафик.

После определения (одна запись в vue.config.js) вы вызываете свой API с тем же URI, что и ваш пользовательский интерфейс (тот же хост и порт), и Vue перенаправляет запрос на сервер API, предоставляя соответствующие заголовки CORS.

смотреть больше на https://cli.vuejs.org/config/#devserver-прокси

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

Yunnosch 08.06.2020 17:46

Спасибо за редактирование, теперь это не просто ответ на ссылку. Но я все еще не вижу смысла в этом ответе по сравнению с существующими ответами. Укажите, какую дополнительную информацию вы предоставляете. Если сделать это более очевидным, это также заметно повысит шансы на одобрение.

Yunnosch 09.06.2020 08:16

У меня была такая же проблема, даже на стороне сервера все было в порядке.

Решение проблемы заключалось в том, что ссылка API, которую я нажал на не хватало косой черты (/) в конце, вызвала ошибку CORS.

Это тоже была моя проблема, но как это может быть решением?

flow 19.09.2020 18:30

Ты шутишь, что ли? Я потратил 1 час, пытаясь исправить это, и ничто вокруг stackoverflow не решило мою проблему, как ваш ответ, добавление косой черты в конце URL-адреса также устранило мою проблему, как это может быть решением?

Fernando Torres 22.07.2021 01:36

Я создаю приложение на Vue.js и добавляю глобальные заголовки в файл main.js.

Пример:

axios.defaults.headers.get['header-name'] = 'value'

Это работает, но нужна помощь в понимании, почему это работает? Спасибо

Mageswaran 27.06.2021 19:34

Я не совсем уверен, что вы имеете в виду под "почему". Вы можете либо добавить заголовок к тому же компоненту/представлению, на который вы делаете вызов, либо просто добавить несколько глобальных в файл main.js. Если у вас есть повторяющиеся заголовки, например. авторизационный, тогда вы можете просто добавить его в файл main.js, и он будет работать во всем приложении :)

Lindow 27.08.2021 16:30

Для обработки проблем CORS теперь вам, возможно, придется вносить изменения на стороне клиента, это не просто проблема сервера.

В Chrome есть несколько плагинов: https://chrome.google.com/webstore/search/cors?hl=ru.

Вы можете попробовать:

В задней части,

  1. npm установить корс

  2. затем в бэкенде app.js добавьте следующее:

    const корс = требуется ('корс')

    app.use (cors ({ происхождение: ['http://localhost:8082'], }))

Надеюсь, это может помочь.

в моем случае, добавив это в мою функцию API бэкэнда php, это сработало

        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS, post, get');
        header("Access-Control-Max-Age", "3600");
        header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
        header("Access-Control-Allow-Credentials", "true");

Не могу добавить это, я получаю веб-сервис с http localhost на сервис https

Fernando Torres 22.07.2021 01:03

в некоторых случаях это не проблема vue. иногда это внутренняя проблема. В моем случае я сделал API в гнезде JS и не включил CORS = true. Вот почему я получаю ошибку политики CORS.

Это не дает ответа на вопрос. Как только у вас будет достаточно репутация, вы сможете комментировать любой пост; вместо этого давать ответы, не требующие пояснений от спрашивающего. - Из обзора

Mark S. 20.10.2021 21:54

Другие вопросы по теме