Подтвердить что ты не робот

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

Я использую AngularJS $http на стороне клиента для доступа к конечной точке приложения ASP.NET Web API на стороне сервера. Поскольку клиент размещен в другом домене как сервер, мне нужен CORS. Он работает для $http.post(url, data). Но как только я аутентифицирую пользователя и делаю запрос через $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 показывает мне, что в запросе запроса есть два записи заголовка после успешного запроса опций. Что и где я делаю что-то не так?

Обновление

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

4b9b3361

Ответ 1

Я добавил

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

а также

app.UseCors(CorsOptions.AllowAll);

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

Ответ 2

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

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

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

Ответ 3

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

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

Подробнее о в этой статье.

Ответ 4

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

Я закончил удаление ВСЕ кода, который включил CORS, а затем добавил следующее в system.webServer node моего Web.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), но создало новую проблему: во время предпросмотра моих вызовов API не удалось найти метод OPTIONS. Исправление для этого было простым - мне просто нужно было удалить следующее из handlers node my Web.Config:

<remove name="OPTIONSVerbHandler" />

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

Ответ 5

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

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN

Итак, в этом примере заголовок ответа будет добавлен только в том случае, если заголовок запроса Origin соответствует RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$ (в основном это означает localhost через HTTP или HTTPS и *.my.base.domain через HTTPS).

Не забудьте включить модуль setenvif.

Docs:

BTW. }e в %{ORIGIN_SUB_DOMAIN}e не является опечаткой. Это как вы используете переменную среды в директиве Header.

Ответ 6

Сервер Apache:

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

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: *

Ответ 7

Это происходит, если у вас есть опция Cors, настроенная в нескольких местах. В моем случае я имел это на уровне контроллера, а также в Startup.Auth.cs/ConfigureAuth.

Я понимаю, что если вы хотите, чтобы приложение было широко распространено, тогда просто настройте его в Startup.Auth.cs/ConfigureAuth как это... Вам понадобится ссылка на Microsoft.Owin.Cors

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

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

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

Ответ 8

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

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

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

и напишите в файле web.config:

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

Ответ 9

просто возникла эта проблема с сервером nodejs.

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

Ответ 10

Это также может произойти, конечно, если вы действительно настроили заголовок 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

Ответ 11

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

В службе 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

Здесь этот код позволяет только предполетному и токенному запросу добавить "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/

Ответ 12

для тех, кто использует IIS с php, в IIS это обновление на стороне сервера. web.config запишите его корневой каталог (wwwroot) и добавьте это

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <httpProtocol>
            <customHeaders>
                <add name="Control-Allow-Origin" value="*"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

после этого перезапустите сервер IIS, введите IISReset в RUN и введите