Поле заголовка запроса. Access-Control-Allow-Headers не разрешено самостоятельно в предполетном ответе

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

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

Поле заголовка запроса. Access-Control-Allow-Headers не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе

Я предположил, что могу это сделать:

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers","*")
})

или эквивалент, но это, похоже, не исправить. Я также, конечно, пробовал

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers","Access-Control-Allow-Headers")
})

По-прежнему не повезло.

Ответ 1

Когда вы начинаете играть с настраиваемыми заголовками запросов, вы получите предварительный предлог CORS. Это запрос, который использует глагол HTTP OPTIONS и включает в себя несколько заголовков, одним из которых является Access-Control-Request-Headers, в котором перечислены заголовки, которые клиент хочет включить в запрос.

Вам нужно ответить на предпросмотр CORS с соответствующими заголовками CORS, чтобы сделать эту работу. Один из них действительно Access-Control-Allow-Headers. Этот заголовок должен содержать те же значения, что и заголовок Access-Control-Request-Headers, содержащий (или больше).

https://fetch.spec.whatwg.org/#http-cors-protocol объясняет эту настройку более подробно.

Ответ 2

Это то, что вам нужно добавить, чтобы это работало.

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers");

Браузер отправляет предварительный запрос (с методом OPTIONS), чтобы проверить, разрешен ли доступ к службе, размещенной на сервере, из браузера в другом домене. В ответ на запрос предварительной проверки, если вы введете вышеуказанные заголовки, браузер понимает, что можно делать дополнительные вызовы, и я получу действительный ответ на мой фактический вызов GET/POST. Вы можете ограничить домен, к которому предоставляется доступ, используя Access-Control-Allow-Origin "," localhost, xvz.com "вместо *. (* предоставит доступ ко всем доменам)

Ответ 3

Эта проблема решена с помощью

 "Origin, X-Requested-With, Content-Type, Accept, Authorization"

В частности, в моем проекте (express.js/nodejs)

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

Обновление:

Ошибка при каждом возникновении ошибки: Access-Control-Allow-Headers is not allowed by itself in preflight response вы можете увидеть, что не так с хром-инструмент для разработчиков:
enter image description here

ошибка выше Content-Type, поэтому добавьте строку Content-Type в Access-Control-Allow-Headers

Ответ 4

Принятый ответ в порядке, но мне было трудно это понять. Итак, вот простой пример, чтобы прояснить это.

В моем запросе ajax у меня был стандартный заголовок авторизации.

    $$(document).on('ajaxStart', function(e){
    var auth_token = localStorage.getItem(SB_TOKEN_MOBILE);
    if( auth_token ) {
        var xhr = e.detail.xhr;

        xhr.setRequestHeader('**Authorization**', 'Bearer ' + auth_token);
    }

Этот код вызывает ошибку в вопросе. То, что я должен был сделать на моем сервере nodejs, - добавить авторизацию в разрешенные заголовки:

res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,**Authorization**');

Ответ 5

Чтобы добавить к другим ответам. У меня была такая же проблема, и это код, который я использовал на моем экспресс-сервере, чтобы разрешать вызовы REST:

  app.all('*', function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'URLs to trust of allow');
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    if ('OPTIONS' == req.method) {
    res.sendStatus(200);
    } else {
      next();
    }
  });

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

EDIT: Я использовал это исправление для двух отдельных узловых серверов nodejs на одном компьютере. В конце концов я исправил проблему простым прокси-сервером.

Ответ 6

Я просто столкнулся с этой проблемой сам, в контексте ASP.NET убедитесь, что ваш Web.config выглядит следующим образом:

  <system.webServer>
<modules>
  <remove name="FormsAuthentication" />
</modules>

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <!--<remove name="OPTIONSVerbHandler"/>-->
  <remove name="TRACEVerbHandler" />
  <!--
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  -->
</handlers>

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

Обратите внимание на значение авторизации для клавиши Access-Control-Allow-Headers. Мне не хватало значения авторизации, эта конфигурация разрешает мою проблему.

Ответ 7

Очень хорошо, что я использовал это в проекте silex

$app->after(function (Request $request, Response $response) {
        $response->headers->set('Access-Control-Allow-Origin', '*');
        $response->headers->set("Access-Control-Allow-Credentials", "true");
        $response->headers->set("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
        $response->headers->set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    });

Ответ 8

В Chrome:

Поле заголовка запроса X-Requested-With не разрешено Access-Control-Allow-Headers в предполетном ответе.

Для меня эта ошибка была вызвана конечным пространством в URL этого вызова.

jQuery.getJSON( url, function( response, status, xhr ) {
   ...
}

Ответ 9

Просто добавьте, что вы можете поместить эти заголовки в файл конфигурации Webpack. Я нуждался в них так же, как и в моем случае, когда я запускал сервер webpack dev.

devServer: {
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Credentials": "true",
      "Access-Control-Allow-Methods": "GET,HEAD,OPTIONS,POST,PUT",
      "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept, Authorization"
},

Ответ 10

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

Необходимым заголовком для этого запроса является Access-Control-Request-Headers, который должен быть частью заголовка ответа и должен разрешать запрос из всех источников. Иногда ему нужен Content-Type а также в заголовке ответа. Итак, ваш заголовок ответа должен быть таким -

 response.header("Access-Control-Allow-Origin", "*"); // allow request from all origin
  response.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
  response.header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization");

Ответ 11

res.setHeader('Access-Control-Allow-Headers', '*');

Ответ 12

Я получил ошибку, указанную OP, используя Django, React и django-cors-headers lib. Чтобы исправить это с помощью этого стека, выполните следующие действия:

В settings.py добавьте ниже в официальную документацию.

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = default_headers + (
'YOUR_HEADER_NAME',
)

Ответ 13

Проведя почти день, я только узнал, что добавление ниже двух кодов решило мою проблему.

Добавьте это в Global.asax

  protected void Application_BeginRequest()
    {
        if (Request.HttpMethod == "OPTIONS")
        {
            Response.StatusCode = (int)System.Net.HttpStatusCode.OK;             
            Response.End();
        }
    }

и в веб-конфигурации добавьте ниже

 <httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />        
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization" />
  </customHeaders>

</httpProtocol>

Ответ 14

При вызове Post API мы отправляем данные в теле запроса. Так что, если мы отправим данные, добавив дополнительный заголовок к вызову API. Затем произойдет первый вызов API OPTIONS, а затем будет выполнен пост-вызов. Следовательно, вы должны сначала обработать вызов API OPTION.

Вы можете решить проблему, написав фильтр, внутри которого вы должны проверить API-вызов вызова опции и вернуть статус 200 OK. Ниже приведен пример кода:

package com.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.Response;

public class CustomFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest httpRequest = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
        if (httpRequest.getMethod().equalsIgnoreCase("OPTIONS")) {
            response.setStatus(Response.SC_OK);
        }
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
        // TODO
    }

    public void destroy() {
        // Todo
    }

}

Ответ 15

Эта же проблема, с которой я столкнулся.

Я сделал простое изменение.

  <modulename>.config(function($httpProvider){
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
});

Ответ 16

Сообщение ясно, что "Авторизация" в API не допускается. Задавать
Access-Control-Allow-Headers: "Тип контента, авторизация"

Ответ 17

Я тоже столкнулся с той же проблемой в Angular 6. Я решил проблему, используя нижеприведенный код.

Add the code in component.ts file.

    import { HttpHeaders } from '@angular/common/http';

    headers;

    constructor() {
        this.headers = new HttpHeaders();
        this.headers.append('Access-Control-Allow-Headers', 'Authorization');
    }

    getData() {
        this.http.get(url,this.headers). subscribe (res => {
    your code here...

    })

}

Ответ 18

Кажется, что на вышеупомянутый вопрос ответили правильно и хорошо оценили все. Но есть проблема для меня, я хочу установить пользовательский ключ в заголовке, как, например, customerkey. Так что проблема, с которой я сталкиваюсь, такая же, как и название всей этой проблемы. Поле заголовка запроса Access-Control-Allow-Headers не разрешено само по себе в ответе перед полетом. Почему я сталкиваюсь с проблемой, кто-нибудь, дайте мне знать, спасибо в любом случае.