Запити заголовкового поля Access-Control-Allow-Headers не дозволено заголовками Access-Control-Allow-Headers


224

Я намагаюся надсилати файли на свій сервер із запитом на публікацію, але коли він надсилає, викликає помилку:

Запит заголовка поля Вміст-тип не дозволений Access-Control-Allow-Headers.

Тому я погукнув помилку і додав заголовки:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

Тоді я отримую помилку:

Запити заголовкового поля Access-Control-Allow-Origin заборонено для заголовків Access-Control-Allow-Headers

Тож я погуглив це, і єдине подібне питання, яке я міг знайти, було надано половинну відповідь, а потім закрите як поза темою. Які заголовки я повинен додати / видалити?


Ці заголовки надсилаються з сервера на браузер, щоб браузер міг вирішити, чи дозволяється JS аналізувати відповідь. Додавання їх до запиту не має значення.
pellyadolfo

Відповіді:


189

Сервер (що запит POST відправляється) має включати в себе Access-Control-Allow-Headersзаголовок ( і т.д.) в своїй відповіді . Внесення їх у свій запит від клієнта не впливає.

Це пояснюється тим, що сервер повинен вказати, що він приймає запити крос-походження (і що він дозволяє Content-Typeзаголовку запиту тощо) - клієнт не може вирішити для себе, що даний сервер повинен дозволити CORS.


5
Як встановити заголовки в бекенді?
користувач3194367

11
@ user3194367: Залежить від вашого бекенда.
Фелікс Клінг

14
Я думаю, мені доведеться поговорити зі своїм сервером.
користувач3194367

2
response.addHeader ("Access-Control-Allow-Headers", "yourKey");
Маюреш

2
@Mayuresh yourKey - це що? Content-Type?
zhuguowei

240

У мене була така ж проблема. У документації jQuery я знайшов:

Для крос-доменних запитів, які задають тип вмісту нічого, крім application/x-www-form-urlencoded, multipart/form-dataабо text/plainзапустить браузер для відправки передпольотний OPTIONS - запит на сервер.

Тож хоч сервер дозволяє запит перехресного походження, але не дозволяє Access-Control-Allow-Headers, він видасть помилки. За замовчуванням тип кутового вмісту є application/json, який намагається надіслати запит OPTION. Спробуйте перезаписати кутовий заголовок за замовчуванням або дозволити його Access-Control-Allow-Headersв кінці сервера. Ось кутовий зразок:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

28
Це має бути прийнятою відповіддю, набагато більш інформативною, ніж інша!
Майк Шендел

1
Мені б хотілося, щоб дані з
кількох

3
or allow Access-Control-Allow-Headers in server endяк?
Омар

1
@omar, це залежить від того, яку серверну платформу ви використовуєте. якщо java є приклад на інші відповіді, якщо php, то є ім'я функції, headerщоб встановити заголовок відповіді
Рибак

1
Нарешті, після двох днів досліджень. У мене немає слів, щоб подякувати вам!
Мекі Саларія

51

Якщо це допомагає комусь, (навіть якщо це погано, тому що ми повинні дозволити це лише з метою розробки), ось рішення Java, оскільки я зіткнувся з тією ж проблемою. [Редагувати] Не використовуйте підстановку *, оскільки це погане рішення, використовуйте, localhostякщо вам дійсно потрібно мати щось місцеве.

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

Як засвідчується численними відповідями для заголовків Access-Control-Request, очевидно, що існують відмінності через різні середовища. Що працювало для мене, це отримати доступ до об’єкта запиту та скинути значення заголовків, а саме значення заголовка для "Access-Control-Request-Headers". Потім скопіюйте / вставте це у свою answer.setHeader ("Access-Control-Allow-Headers", "{paste here}"); Я також використовую Java, але мені потрібні додаткові значення, і деякі згадані в цій відповіді мені не потрібні.
Software Prophets

Це було частковим (і, як було сказано, поганим) рішенням, щоб допомогти людям та поділитися довідками за рік назад. Я не бачу сенсу голосувати проти, але це - ваша свобода. Ідея полягає в тому, щоб дозволити заголовки на стороні сервера, тому коли розміщений запит OPTION, клієнт / браузер знає, які заголовки дозволені. Я усвідомлюю, що є деяка плутанина, мій фільтр CORS сильно змінився відтоді. Як краща практика, Access-Control-Allow-Origin ніколи не повинен бути *; у моєму виконанні його встановлює властивість.
lekant

Рішення було відредаговано, щоб включити кращі практики
лекант,

16

Сервер (на який надсилається запит POST) повинен відповідати заголовку типу вмісту у своїй відповіді.

Ось список типових заголовків, які слід включити, включаючи один нестандартний заголовок "X_ACCESS_TOKEN":

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

Це те, що потрібно налаштувати ваш хлопець http-сервера для веб-сервера, на який ви надсилаєте свої запити.

Ви також можете попросити хлопця вашого сервера викрити заголовок "Довжина вмісту".

Він розпізнає це як запит перехресного походження ресурсів (CORS) і повинен розуміти наслідки створення цих конфігурацій сервера.

Докладніше див:


13

Ви можете активувати правильний заголовок у PHP за допомогою цього:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");

4
Опишіть, будь ласка, чим ваша відповідь відрізняється від інших відповідей. Просто розміщення якогось коду не дуже корисно.
oscfri

1
Ви рок-зірка, решта відповідей заглиблюється в технічну сторону. Ви виправляєте мою проблему, вказуючи методи, які також слід дозволити!
Даніель ЗА

1
@DanielZA, хоча я розумію, що ви маєте на увазі під "іншими відповідями, заглиблюючись у технічну сторону", оскільки ви просто хочете змусити запустити свій код, так це означає заглиблюватися в технічну сторону речей, як ви повинні знати, чому все працює не просто як змусити потім працювати. Не вдавайте такої поведінки, коментуючи рішення ...
nicolasassi

8

Наступні роботи для мене з nodejs:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});

чи має значення порядок методів доступу-контролю-дозволу?
vini

@vini, я думаю, це не має значення.
Кодування Ninja

4

Заголовки, які ви намагаєтеся встановити, - це заголовки відповідей . Вони повинні бути надані у відповідь сервером, на який ви звертаєтесь із запитом.

Вони не мають місця для клієнта. Було б безглуздо мати засоби для надання дозволів, якби їх міг надати веб-сайт, який хотів отримати дозвіл замість веб-сайту, що володіє даними.


Як встановити заголовки в бекенді?
користувач3194367

@ user3194367 - Це залежить від вашого бекенда. Я не знаю, на який HTTP-сервер чи мову програмування ви робите запит.
Квентін

Я думаю, мені доведеться поговорити зі своїм сервером.
користувач3194367

3

Якщо хтось відчуває цю проблему з експрес-сервером, додайте наступне проміжне програмне забезпечення

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

3

якщо ви тестуєте деякі запити javascript для ionic2 або angularjs 2, у своєму хроматі на ПК або mac, то будьте впевнені, що ви встановите плагін CORS для браузера Chrome, щоб дозволити перехресне походження.

Запити майби можуть працювати, не потребуючи цього, але для публікації та додавання та видалення знадобиться встановити плагін Cors для тестування, щоб пройти без проблем, що definitley не круто, але я не знаю, як це робити без плагіна CORS.

а також переконайтесь, що відповідь json не повертає 400 деяким статусом json


3

це проблема із заднім числом. якщо використовуєте вітрила api на зміну резервного копіювання cors.js і додайте сюди свої файли

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};

3

В Asp Net Core , щоб швидко примусити його працювати на розвиток; в Startup.cs, Configure methodдодати

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

2

У моєму випадку я отримую кілька параметрів як @HeaderParam в метод веб-сервісу.

Ці параметри ОБОВ'ЯЗКОВО задекларувати у вашому фільтрі CORS таким чином:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

2

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-HeadersПомилка означає, що Access-Control-Allow-Originполе заголовка HTTP не обробляється і не допускається у відповідь. Видалити Access-Control-Allow-Originполе із заголовка запиту.


2

Якщо ви використовуєте для цього localhostі PHP, щоб вирішити проблему:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type'); 

З вашого переднього використання:

{headers: {"Content-Type": "application/json"}}

і бум більше не має питань localhost!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.