Заголовок 'Access-Control-Allow-Origin' містить кілька значень


104

Я використовую AngularJS $ http на стороні клієнта для доступу до кінцевої точки програми ASP.NET Web API на стороні сервера. Оскільки клієнт розміщений на іншому домені, як сервер, мені потрібен CORS. Він працює для $ http.post (URL, дані). Але як тільки я автентифікую користувача та роблю запит через $ http.get (url), я отримую повідомлення

Заголовок 'Access-Control-Allow-Origin' містить кілька значень 'http://127.0.0.1:9000, http://127.0.0.1:9000', але дозволено лише одне. Таким чином, походження "http://127.0.0.1:9000" не має доступу.

Fiddler показує мені, що дійсно є дві записи заголовка в запиті get після успішного запиту параметрів. Що і де я роблю щось не так?

Оновлення

Коли я використовую jQuery $ .get замість $ http.get, з'являється те саме повідомлення про помилку. Отже, це виглядає без проблем з AngularJS. Але де це неправильно?


Що ж містить заголовок?
eckes

Відповіді:


53

я додав

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

так само, як

app.UseCors(CorsOptions.AllowAll);

на сервері. Це призводить до двох записів заголовків. Просто використовуйте останній, і він працює.


4
Схоже, ви читаєте Properties.Settings.Default.Cors з файлу налаштувань. Чи можете ви розмістити приклад? І в якому класі використовується UseCors?
Хоппе

"Uncaught ReferenceError: EnableCorsAttribute не визначено" ??
схема

@Hoppe, погляньте на msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx . Він пояснює, що перший параметр EnableCorsAttribute - це дозволене джерело. Наприклад, "*", щоб дозволити всім.
Папа Муфлон

1
@Hoppe, UseCors - це метод розширення, визначений у пакеті NuGet Microsoft.Owin.Cors. Sf katanaproject.codeplex.com/SourceControl/latest#src / ... .
Папа Муфлон

7
config.EnableCors (enableCorsAttribute) зазвичай називається в WebApiConfig.cs - це частина пакету Microsoft.AspNet.WebApi.Cors Nuget, використання якого описано тут: asp.net/web-api/overview/security/… додаток .UseCors (CorsOptions.AllowAll) зазвичай викликається в Startup.Auth.cs як частина налаштування вашого постачальника ідентифікаційних даних (наприклад, OAuth) і є частиною пакету Microsoft.Owin.Cors Nuget.
Генрі C

51

Ми зіткнулися з цією проблемою, оскільки створили 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.

Видаліть запис web.config, і все добре.

Всупереч відповіді @ mww, у нас все ще є EnableCors()WebApiConfig.cs І EnableCorsAttributeна контролері. Коли ми виймали те чи інше, ми стикалися з іншими питаннями.


11
Я видалив цей рядок <add name = "Access-Control-Allow-Origin" value = "*" />, і у мене були такі два записи у файлі web.config, які я не видаляв: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Access-Control-Allow-Methods "value =" GET, POST, PUT, DELETE, OPTIONS "/>
Siva Karthikeyan

2
Це ключове значення, ви повинні ввімкнути CORS лише один раз, моя проблема полягала в тому, що я також його ввімкнув у своєму web.config, а також у app.UseCors () ... Я видалив запис web.config і просто використав додаток.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); замість цього.
Мохаммед Сепахванд

1
Рядок вище врятував мені життя! Переконайтеся, що ви не включаєте CORS не один раз, інакше це станеться, і ви будете дуже розчаровані.
TGarrett

видалив значення <add name = "Access-Control-Allow-Headers" = "Content-Type" /> з web.config і виправив мене
jbooker

1
"Це ключове значення, ви повинні ввімкнути CORS лише один раз" <- ЦЕ ТАК @MohammadSepahvand ДЯКУЄТЬСЯ. Повернутися до .NET і вже здивований: D.
Туан Джінн

42

Я використовую Cors 5.1.0.0, після сильного головного болю я виявив, що проблема дублюється заголовками Access-Control-Allow-Origin & Access-Control-Allow-Header із сервера

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

Перегляньте цю статтю для більш детальної інформації.


це працює для мене, просто переконайтеся, що ви не встановлюєте іншого подібного <add name = "Access-Control-Allow-Origin" value = "*" /> в web.config
Crismogram

12

Додати до реєстрації WebApiConfig

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Або web.config

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

АЛЕ НЕ БУТИ


2
Це було ключове рішення для мене, не робіть і того, і іншого.
robnick

8

Насправді ви не можете встановити кілька заголовків 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модуль.

Документи:

До речі. }eУ %{ORIGIN_SUB_DOMAIN}eце не помилка. Це те, як ви використовуєте змінну середовища в Headerдирективі.


1
Чи є у вас джерело для не встановлення кількох заголовків контролю доступу? Я не можу знайти нічого, що це підтверджує.
Спенсер

Дуже розумне та чисте рішення. Працювали для мене.
Олексій Кальміков

@Spencer "Примітка. На практиці виробництво списків-початків або нульове виробництво є більш обмеженим. Замість того, щоб дозволити розділений пробілом список джерел, це або одне походження, або рядок" null " ." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

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

Я в кінці видалив ВСІЙ код, який увімкнув CORS, а потім додав у system.webServerвузол моєї 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), але це створило нову проблему: OPTIONSметод не вдалося знайти під час передпольоту для моїх дзвінків API. Виправити це було просто - мені просто потрібно було видалити наступне з handlersвузла мого Web.Config:

<remove name="OPTIONSVerbHandler" />

Сподіваюся, що це комусь допоможе.


7

Сервер Apache:

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

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

Ви також можете мати файл ".htaccess" у папці з іншим ".htaccess", наприклад

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

У вашому випадку зірочкою замість '*' буде http://127.0.0.1:9000сервер ip ( ), якому ви надаєте дозвіл на обслуговування даних.

ASP.NET:

Перевірте, чи немає у вашому коді дубліката "Access-Control-Allow-Origin".

Інструменти для розробників:

За допомогою Chrome ви можете перевірити заголовки запиту. Натисніть клавішу F12 і перейдіть на вкладку «Мережа», тепер запустіть запит AJAX і з’явиться у списку, натисніть і введіть всю інформацію там.

Контроль доступу-дозволити-вихід: *


Іноді це так просто ... Під час спроби змусити цих заплутаних веб-сервісів працювати на IIS / Chrome, я розігрувався методом Application_BeginRequest і забув про це ... дублювання у власному коді! Дякую, що вказали мені на очевидне! :)
Юрген Рімер

2
Щоб отримати заголовки відповідей CORS, вам також доведеться моделювати фактичний запит перехресного походження, тому він може не з’являтися, якщо ви просто подивіться на вкладку мережі на запущеному сайті. Однак використовувати щось на зразок DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) для запуску запиту AJAX технічно буде дзвонити з іншого домену, тим самим запускаючи CORS і дозволяючи бачити заголовки контролю доступу.
Генріх C

4

Це відбувається, коли у вас є параметр 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;

У моєму випадку я його встановив як у Web.Config, так і в MyAppApiConfig.cs. Видалення його з останнього вирішило для мене проблему.
Джим Б

4

якщо ви перебуваєте в 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>


2

Це може статися, звичайно, якщо ви фактично встановили у своєму 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


Отже, ви не можете зараз, оскільки сумнівно, що ви хочете, щоб кожен домен в Інтернеті потрапляв на URL.
scottheckel

Посилання Akamai потребує входу в систему.
Жан-Франсуа

так, це, як видається, є вимогою акамая для цих документів ;-(
Бред Паркс

Інший спосіб отримати цю помилку в Chrome є з розділеними пробілами списку значень: Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com. Це був би правильний шлях, але браузери не дотримуються тут стандарту ( джерело ).
таніус

2

Так дурно і просто:

Ця проблема у мене виникла, коли я два рази Header always set Access-Control-Allow-Origin *знаходився в моєму конфігураційному файлі Apache. Один раз промацувавши VirtualHostтеги та потрапивши всередину Limitтегу:

<VirtualHost localhost:80>
  ...
  Header set Access-Control-Allow-Origin: *
  ...
  <Limit OPTIONS>
    ...
    Header set Access-Control-Allow-Origin: *
    ...
  </Limit>
</VirtualHost>

Видалення одного запису вирішило проблему.

Я думаю, що в оригінальній публікації це було б два рази:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"

1

просто була ця проблема з сервером nodejs.

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


Дякую за цю відповідь! Це вирішило проблему, яку я довго не міг вирішити за допомогою установки nginx + Rack (Ruby). Те саме питання, те саме рішення: Вимкніть доповнення заголовка в nginx і нехай rack-corsкамінь обробляє речі CORS. Бам, фіксований.
Пістос

0

Я зіткнувся з тим же питанням, і ось що я зробив, щоб вирішити його:

У службі 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 /


0

для тих, хто використовує 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 та введіть


0

Ось ще один екземпляр, подібний до прикладів вище, що у вас може бути лише один файл конфігурації, де визначається CORS: На сервері IIS на шляху до різних каталогів було два файли web.config, і один з них був прихований у віртуальному каталозі. Для її вирішення я видалив файл конфігураційного рівня кореневого рівня, оскільки шлях використовував конфігураційний файл у віртуальному каталозі. Доводиться вибирати те чи інше.

URL called:  'https://example.com/foo/bar'
                     ^              ^
      CORS config file in root      virtual directory with another CORS config file
          deleted this config             other sites using this


0

Заголовок 'Access-Control-Allow-Origin' містить кілька значень

коли я отримав цю помилку, я витратив багато годин на пошук рішення для цього, але нічого не працює, нарешті я знайшов рішення цієї проблеми, яке дуже просте. коли заголовок 'Access-Control-Allow-Origin' додано не один раз до вашої відповіді, виникає ця помилка, перевірте свій apache.conf або httpd.conf (сервер Apache), скрипт на стороні сервера та видаліть із цих файлів непотрібний заголовок запису .

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