“Access-Control-Allow-Origin”标题包含多个值
我在客户端使用AngularJS $ http访问服务器端的ASP.NET Web API应用程序的端点。 由于客户端与服务器位于不同的域,因此我需要CORS。 它适用于$ http.post(url,数据)。 但只要我authentication用户,并通过$ 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'因此不被允许访问。
提琴手向我展示,在获得成功的选项请求后,确实有两个标题条目。 什么和我在哪里做错了什么?
更新
当我使用jQuery $ .get而不是$ http.get时,出现相同的错误信息。 所以这对于AngularJS来说似乎没有问题。 但是哪里错了?
我补充说
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 ),在web.config中也有一个自定义的头文件<add name="Access-Control-Allow-Origin" value="*"/>
。
删除web.config项,一切正常。
与@ mww的答案相反,我们在WebApiConfig.cs中还有EnableCors()
,在控制器上还有EnableCorsAttribute
。 当我们拿出一个或另一个,我们遇到了其他问题。
我在使用Cors 5.1.0.0之后,非常头疼,我发现要复制的问题Access-Control-Allow-Origin&Access-Control-Allow-Header头从服务器
从WebApiConfig.cs文件中删除config.EnableCors()
,并在Controller类上设置[EnableCors("*","*","*")]
属性
检查这篇文章的更多细节。
我也有OWIN以及我的WebAPI,这两个显然需要单独启用CORS,这又创build了'Access-Control-Allow-Origin' header contains multiple values
错误。
我最终删除了启用CORS的所有代码,然后将以下内容添加到我的Web.Config的system.webServer
节点中:
<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>
这样做满足了OWIN(允许login)和WebAPI(允许API调用)的CORS要求,但是它创build了一个新问题:在我的API调用的预检期间找不到OPTIONS
方法。 修复这很简单 – 我只需要从handlers
节点我的Web.Config删除以下内容:
<remove name="OPTIONSVerbHandler" />
希望这有助于某人。
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,您可以validation您的请求标题。 按F12键,进入“networking”选项卡,现在运行AJAX请求并出现在列表中,单击并提供所有信息。
其实你不能设置多个标题Access-Control-Allow-Origin
(或者至less它不能在所有浏览器中工作)。 相反,你可以有条件地设置一个环境variables,然后在Header
指令中使用它:
SetEnvIf Origin "^(https?://localhost|https://[az]+\.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://[az]+\.my\.base\.domain)$
表示通过HTTP或HTTPS的本地主机和通过HTTPS的* .my.base.domain)。
记得启用setenvif
模块。
文档:
- http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif
- http://httpd.apache.org/docs/2.2/mod/mod_headers.html#header
BTW。 %{ORIGIN_SUB_DOMAIN}e
中的%{ORIGIN_SUB_DOMAIN}e
不是拼写错误。 这是你如何在Header
指令中使用环境variables。
当您在多个地点configurationCors选项时,会发生这种情况。 在我的情况下,我在控制器级别以及在Startup.Auth.cs / ConfigureAuth。
我的理解是,如果你想要它的应用程序广泛,然后只需要像这样在Startup.Auth.cs / ConfigureAuthconfiguration它…您将需要参考Microsoft.Owin.Cors
public void ConfigureAuth(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll);
如果您宁愿将其保存在控制器级别,那么您可以在控制器级别插入。
[EnableCors("http://localhost:24589", "*", "*")] public class ProductsController : ApiController { ProductRepository _prodRepo;
刚刚有一个nodejs服务器的这个问题。
这里是我如何修复它。
我运行我的节点服务器通过一个nginx proxy
,我设置nginx和node
都allow cross domain requests
,并没有这样做,所以我从nginx中删除它,并把它留在节点,一切都很好。
如果你在IIS中,你需要在web.config中激活CORS,那么你不需要在App_Start / WebApiConfig.cs中启用Register方法
我的解决scheme是,在这里评论的线:
// Enable CORS //EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); //config.EnableCors(cors);
并在web.config中写入:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol>