Заголовок "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 и появится в списке, нажмите и дайте всю информацию там.
это происходит, когда у вас есть опция 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/