Заголовок "Access-Control-Allow-Origin" содержит несколько значений

Я использую AngularJS $http на стороне клиента для доступа к конечной точке ASP.NET приложение Web API на стороне сервера. Поскольку клиент размещен в другом домене в качестве сервера, Мне нужен CORS. Он работает для $ http.post (url, данные). Но как только я проверить подлинность пользователя и сделать запрос через $протоколу HTTP.get (url), я получаю сообщение

The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access.

Fiddler показывает мне, что в запросе get действительно есть две записи заголовка после успешного запроса опций. Что и где я что-то не так?

обновление

когда я использую jQuery $.получить вместо $http.вам, появляется то же сообщение об ошибке. Так что это не проблема с AngularJS. Но что в этом плохого?

11 ответов


добавил

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

а также

app.UseCors(CorsOptions.AllowAll);

на сервере. Это приводит к двум записям заголовка. Просто используйте последний, и он работает.


мы столкнулись с этой проблемой, потому что мы создали CORS в соответствии с лучшей практикой (например http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api), а также имел пользовательский заголовок <add name="Access-Control-Allow-Origin" value="*"/> в интернете.конфиг.

удалить веб.config запись, и все хорошо.

вопреки ответу @mww, у нас все еще есть EnableCors() в WebApiConfig.cs и an EnableCorsAttribute на контроллере. Когда мы убирали одного или другого, мы сталкивались с другими. проблемы.


Я использую Cors 5.1.0.0, после большой головной боли я обнаружил, что проблема дублируется Access-Control-Allow-Origin & Access-Control-Allow-заголовки заголовков с сервера

удалены config.EnableCors() из WebApiConfig.cs-файл и просто установите [EnableCors("*","*","*")] атрибут класса контроллера

Регистрация в этой статье подробнее.


у меня тоже были оба OWIN, а также Мой WebAPI, которые, по-видимому, нуждались в CORS отдельно, что, в свою очередь, создало 'Access-Control-Allow-Origin' header contains multiple values ошибка.

Я закончил тем, что удалил весь код, который включил CORS, а затем добавил следующее к system.webServer узел моей сети.Config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
  </customHeaders>
</httpProtocol>

выполнение этого удовлетворяет требованиям CORS для OWIN (разрешение входа в систему) и для WebAPI (разрешение вызовов API), но это создало новую проблему:OPTIONS метод не может быть найден во время предполетной подготовки для моего вызов API. Исправление для этого было простым-мне просто нужно было удалить следующее из handlers мой веб-узел.Config:

<remove name="OPTIONSVerbHandler" />

надеюсь, это кому-то поможет.


на самом деле вы не можете установить несколько заголовков Access-Control-Allow-Origin (или, по крайней мере, он не будет работать во всех браузерах). Вместо этого вы можете условно установить переменную среды, а затем использовать ее в


Сервер Apache:

Я трачу то же самое, но это было потому, что у меня не было кавычек (") Звездочка в моем файле, которая предоставляла доступ к серверу, например '.реврайт.':

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

у вас также может быть файл '.htaccess" в папке с другим".htaccess, что-нибудь, например,

/ 
- .htaccess 
- public_html / .htaccess (problem here)

в вашем случае вместо звездочки " * " будет ip (http://127.0.0.1:9000) сервер, который вы разрешаете обслуживать данные.

ASP.NET:

убедитесь, что в вашем коде нет дубликата "Access-Control-Allow-Origin".

Разработчик:

С Chrome вы можете проверить заголовки запросов. Нажмите клавишу F12 и перейдите на вкладку "Сеть", теперь запустите запрос AJAX и появится в списке, нажмите и дайте всю информацию там.

Access-Control-Allow-Origin: *


это происходит, когда у вас есть опция Cors, настроенная в нескольких местах. В моем случае у меня это было на уровне контроллера, а также при запуске.Автор.cs / ConfigureAuth.

Я понимаю, если вы хотите, чтобы это приложение было широким, просто настройте его при запуске.Автор.cs / ConfigureAuth, как это...Вам понадобится ссылка на Microsoft.Оуин.Пдбс

public void ConfigureAuth(IAppBuilder app)
        {
          app.UseCors(CorsOptions.AllowAll);

Если вы предпочитаете держать его на уровне контроллера, то вы можете просто вставить в контроллер уровень.

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;

Если вы находитесь в IIS, вам нужно активировать CORS в интернете.config, тогда вам не нужно включать в App_Start / WebApiConfig.метод регистрации cs

мое решение было, прокомментировать строки:

// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);

и пишем в интернете.config:

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


просто была эта проблема с сервером nodejs.

вот как я это исправил.
я запускаю свой сервер узлов через nginx proxy и я установил nginx и node как allow cross domain requests и это не понравилось, поэтому я удалил его из nginx и оставил его в узле, и все было хорошо.


Это также может произойти, конечно, если вы действительно установили свой Access-Control-Allow-Origin заголовок, чтобы иметь несколько значений - например, список значений, разделенных запятыми, который является вид поддерживается в RFC но на самом деле не поддерживается большинством основных браузерах. Обратите внимание, что RFC говорит о том, как разрешить более одного домена без использования '*' а также.

например, вы можете получить эту ошибку в Chrome, используя заголовок типа Итак:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

Это было Chrome Version 64.0.3282.186 (Official Build) (64-bit)

обратите внимание, что если вы рассматриваете это из-за CDN, и вы используете Akamai, вы можете отметить, что Akamai не будет кэшировать на сервере, если вы используете Vary:Origin, кстати многие предлагают решить эту проблему.

вероятно, вам придется изменить способ построения ключа кэша, используя поведение ответа "изменение идентификатора кэша". Больше сведения об этой проблеме в этом связанном StackOverflow вопрос


я столкнулся с той же проблемой, и это то, что я сделал, чтобы решить ее:

в службе WebApi, внутри Global.asax я написал следующий код:

Sub Application_BeginRequest()
        Dim currentRequest = HttpContext.Current.Request
        Dim currentResponse = HttpContext.Current.Response

        Dim currentOriginValue As String = String.Empty
        Dim currentHostValue As String = String.Empty

        Dim currentRequestOrigin = currentRequest.Headers("Origin")
        Dim currentRequestHost = currentRequest.Headers("Host")

        Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
        Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")

        If currentRequestOrigin IsNot Nothing Then
            currentOriginValue = currentRequestOrigin
        End If

        If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
            currentResponse.Headers.Remove("Access-Control-Allow-Origin")
            currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
        End If

        For Each key In Request.Headers.AllKeys
            If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
                currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
                currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
                currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
                currentResponse.StatusCode = 200
                currentResponse.End()
            End If
        Next

    End Sub

здесь этот код позволяет только запрос pre-flight и token добавить "Access-Control-Allow-Origin" в ответ, иначе я его не добавляю.

вот мой блог о выполнении: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular-6/