我在客户端使用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告诉我,在成功的选项请求之后,get请求中确实有两个头条目。我做错了什么,在哪里?
更新
当我使用jQuery $ .get而不是$ http.get时,会出现相同的错误消息。所以AngularJS似乎没有问题。但哪里错了?
答案 0 :(得分:49)
我添加了
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
以及
app.UseCors(CorsOptions.AllowAll);
在服务器上。这导致两个标题条目。只需使用后一种即可。
答案 1 :(得分:45)
我们遇到了这个问题,因为我们根据最佳实践设置了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
。当我们拿出一个或另一个时,我们遇到了其他问题。
答案 2 :(得分:37)
我使用Cors 5.1.0.0,经过一番头痛,我发现这个问题有待重复 Access-Control-Allow-Origin&amp;来自服务器的Access-Control-Allow-Header标头
从WebApiConfig.cs文件中删除config.EnableCors()
,只在Controller类上设置[EnableCors("*","*","*")]
属性
查看this article了解更多详情。
答案 3 :(得分:7)
实际上,您无法设置多个标头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)$
(它基本上表示通过HTTP的HTTPS或HTTPS和* .my.base.domain上的localhost )。
请记住启用setenvif
模块。
文档:
顺便说一句。 }e
中的%{ORIGIN_SUB_DOMAIN}e
不是拼写错误。这是你在Header
指令中使用环境变量的方式。
答案 4 :(得分:7)
我既有OWIN也有我的WebAPI,两者显然都需要单独启用CORS,这反过来又会产生'Access-Control-Allow-Origin' header contains multiple values
错误。
我最终删除了启用CORS的所有代码,然后将以下内容添加到我的Web的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>
为OWIN(允许登录)和WebAPI(允许API调用)执行此满足的CORS要求,但它创建了一个新问题:在我的API调用的预检期间找不到OPTIONS
方法。解决这个问题很简单 - 我只需要从handlers
节点中删除以下内容我的Web.Config:
<remove name="OPTIONSVerbHandler" />
希望这有助于某人。
答案 5 :(得分:5)
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请求并显示在列表中,单击并提供所有信息。
答案 6 :(得分: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;
答案 7 :(得分:2)
如果您在IIS中,则需要在web.config中激活CORS,然后您不需要在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>
答案 8 :(得分:2)
添加到注册WebApiConfig
passport: {
strategy: 'saml',
saml: {
path: process.env.SAML_PATH || '/saml/path',
entryPoint: process.env.SAML_ENTRY_POINT || 'link-provided-by-client',
issuer: 'asd:issuer:as:appname.asd.com',
entityID: 'as.asd.client.com',
cert: 'MI...1ln'
}}
或web.config
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
不是全部
答案 9 :(得分:1)
刚刚遇到nodejs服务器的这个问题。
这是我如何修理它。
我通过nginx proxy
运行我的节点服务器,并将nginx和node
设置为allow cross domain requests
并且它不是那样的,所以我将它从nginx中删除并将其保留在节点中并且一切都很好。
答案 10 :(得分:1)
当然,如果您实际上将Access-Control-Allow-Origin
标头设置为具有多个值,也会发生这种情况 - 例如,以逗号分隔的值列表,kind of supported in the RFC但实际上不受支持大多数主流浏览器。请注意,the RFC talks about how to allow more than one domain也不使用'*'。
例如,您可以使用如下标题在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 wont cache on the server if you use Vary:Origin
,这是许多人建议解决此问题的方式。
您可能必须使用“缓存ID修改”响应行为来更改缓存键的构建方式。更多details on this issue in this related StackOverflow question
答案 11 :(得分:1)
“ Access-Control-Allow-Origin”标头包含多个值
当我收到此错误时,我花了数小时来寻找解决方案,但没有任何效果,最后我找到了解决该问题的方法,这很简单。 当“ Access-Control-Allow-Origin”标头多次添加到您的响应时,发生此错误,请检查您的apache.conf或httpd.conf(Apache服务器),服务器端脚本,并从这些文件中删除不需要的条目标头
答案 12 :(得分: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”,否则我不会添加它。
答案 13 :(得分:0)
laravel
在重新启动IIS服务器之后, 在RUN中键入IISReset并输入
答案 14 :(得分: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
答案 15 :(得分:0)
我的Apache配置文件中有两次Header always set Access-Control-Allow-Origin *
时,对我来说出现了这个问题。一次使用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"