「Access-Control-Allow-Origin」ヘッダーには複数の値が含まれています


104

クライアント側でAngularJS $ httpを使用して、サーバー側のASP.NET Web APIアプリケーションのエンドポイントにアクセスしています。クライアントはサーバーとは異なるドメインでホストされているため、CORSが必要です。$ http.post(url、data)で機能します。しかし、ユーザーを認証し、$ http.get(url)を介してリクエストを行うとすぐに、メッセージが表示されます

「Access-Control-Allow-Origin」ヘッダーには複数の値「http://127.0.0.1:9000、http://127.0.0.1:9000」が含まれていますが、許可されているのは1つだけです。したがって、Origin 'http://127.0.0.1:9000'はアクセスを許可されません。

Fiddlerは、オプション要求が成功した後、get要求に実際に2つのヘッダーエントリがあることを示しています。何がどこで間違っているのですか?

更新

$ http.getの代わりにjQuery $ .getを使用すると、同じエラーメッセージが表示されます。したがって、これはAngularJSには問題がないようです。しかし、どこが間違っているのでしょうか?


さて、ヘッダーには何が含まれていますか?
エケス

回答:


53

追加した

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

と同様

app.UseCors(CorsOptions.AllowAll);

サーバー上。これにより、2つのヘッダーエントリが生成されます。後者を使用するだけで機能します。


4
設定ファイルからProperties.Settings.Default.Corsを読み取っているようです。例を投稿できますか?そしてUseCorsはどのクラスにありますか?
Hoppe 2014年

「Uncaught ReferenceError:EnableCorsAttribute is not defined」??
回路

@Hoppe、msdn.microsoft.com /en-us/library/dn314597(v=vs.118).aspxをご覧ください。これは、EnableCorsAttributeの最初のパラメーターが許可されたオリジンであることを説明しています。たとえば、すべてを許可する「*」。
Papa Mufflon、2014年

1
@ Hoppe、UseCorsは、NuGetパッケージMicrosoft.Owin.Corsで定義されている拡張メソッドです。SF katanaproject.codeplex.com/SourceControl/latest#src/...
Papa Mufflon、2014年

7
config.EnableCors(enableCorsAttribute)通常WebApiConfig.csに呼ばれている- Microsoft.AspNet.WebApi.Cors Nugetパッケージのそれの一部、ここで説明されているの使用:asp.net/web-api/overview/security/... アプリ.UseCors(CorsOptions.AllowAll)は、通常、IDプロバイダー(OAuthなど)の構成の一部としてStartup.Auth.csで呼び出され、Microsoft.Owin.Cors Nugetパッケージの一部です。
Henry 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エントリを削除すれば、すべて順調です。

EnableCors()@mww の答えとは逆に、WebApiConfig.csとEnableCorsAttributeコントローラー上にまだあります。どちらかを取り出したときに、他の問題に遭遇しました。


11
この行を削除しました<add name = "Access-Control-Allow-Origin" value = "*" />とweb.configファイルに次の2つのエントリがありましたが、削除しませんでした:<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エントリを削除して、app.UseCorsを使用しました(Microsoft.Owin.Cors.CorsOptions.AllowAll); 代わりにメソッド。
Mohammad Sepahvand

1
上記の行は私の命を救った!CORSを2回以上有効にしないでください。有効にすると、これが発生し、非常にイライラします。
TGarrett 2016

<add name = "Access-Control-Allow-Headers" value = "Content-Type" />をweb.configから
削除し

1
「これが鍵です。CORSを一度だけ有効にする必要があります」<-これはIT @MohammadSepahvandに感謝します。.NETに戻り、すでに驚いた:D。
トゥアンジン2018年

42

私はCors 5.1.0.0を使用していますが、多くの頭痛の後、サーバーからAccess-Control-Allow-OriginヘッダーとAccess-Control-Allow-Headerヘッダーが重複している問題を発見しました

config.EnableCors()WebApiConfig.csファイルから削除さ[EnableCors("*","*","*")]れ、Controllerクラスの属性を設定するだけ

詳細についてはこの記事を確認してください。


これは私にとってはうまくいきます
。web.configで

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
これは私にとって重要な解決策でした。両方を実行しないでください。
ロブニック

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

したがって、この例では、要求ヘッダーがOriginRegExp:と一致する場合にのみ応答ヘッダーが追加されます^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(基本的に、HTTPまたはHTTPSを介したlocalhostおよびHTTPSを介した* .my.base.domainを意味します)。

setenvifモジュールを有効にすることを忘れないでください。

ドキュメント:

ところで。}e中には%{ORIGIN_SUB_DOMAIN}eタイプミスではありません。Headerディレクティブで環境変数を使用する方法です。


1
複数のアクセス制御ヘッダーを設定しないためのソースはありますか?これを確認するものは何も見つかりません。
スペンサー

非常にスマートでクリーンなソリューション。私のために働いた。
Alex Kalmikov

@Spencer "注:実際にはorigin-list-or-nullの生成はより制限されています。スペースで区切られた起点のリストを許可するのではなく、単一の起点または文字列" 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.webServerWeb.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要件は満たされましたが、新しい問題が発生しました:OPTIONSAPI呼び出しのプリフライト中にメソッドが見つかりませんでした。その修正は簡単でした- 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リクエストが実行され、リストに表示されます。クリックしてすべての情報を入力します。

Access-Control-Allow-Origin:*


ときどきそれは簡単です...混乱したWebサービスをIIS / Chromeで実行しようとしているときに、Application_BeginRequestメソッドをいじってみましたが、忘れていました...自分のコードでの重複!明らかなことを教えてくれてありがとう!:)
Juergen Riemer 2014年

2
CORS応答ヘッダーを取得するには、実際のクロスオリジンリクエストもシミュレートする必要があるため、実行中のサイトのネットワークタブを見ただけでは表示されない場合があります。ただし、DHC(chrome.google.com/webstore/detail/dhc-resthttp-api-client/…)などを使用してAJAXリクエストを実行すると、技術的には別のドメインから呼び出されるため、CORSがトリガーされ、アクセス制御ヘッダー。
Henry 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の両方で設定しました。後者から削除することで、問題は解決しました。
ジムB

4

IISを使用している場合は、web.configでCORSをアクティブにする必要があります。App_Start/ WebApiConfig.cs Registerメソッドで有効にする必要はありません。

私の解決策は、ここの行にコメントしました:

// 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。この問題を解決するために多くの人が提案している方法です。

おそらく、「キャッシュID変更」応答動作を使用して、キャッシュキーの構築方法を変更する必要があります。もっとこの関連StackOverflowの質問でこの問題の詳細


したがって、基本的には、インターネット上のすべてのドメインがURLにアクセスすることを望んでいるのではないかと思います。
scottheckel

Akamaiリンクはログインする必要があります。
Jean-FrançoisSavard

ええ、それはそれらのドキュメントのアカマイ要件であるようです;-(
Brad Parks

Chromeでこのエラーを取得する別の方法は、スペースで区切られた値のリストを使用することです:Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com。それ正しい方法ですが、ブラウザはここでの標準に従っていません(ソース)。
タニアス

2

とても愚かでシンプルです:

この問題はHeader always set Access-Control-Allow-Origin *、Apache構成ファイル内に2つの時間があるときに発生しました。VirtualHostタグを削除した後、タグ内に一度Limit

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

1つのエントリを削除すると、問題が解決しました。

元の投稿では2回だったと思います。

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

1

nodejsサーバーでこの問題が発生しました。

ここで私はそれを修正した方法です。
私はノードサーバーをa nginx proxyを介して実行し、nginxとnodeその両方allow cross domain requestsを設定しましたが、それが好きではなかったので、nginxからそれを削除してノードに残し、すべてが順調でした。


この回答ありがとうございます!nginx + Rack(Ruby)セットアップで長い間解決できなかった問題を解決しました。同じ問題、同じ解決策:nginxでヘッダーの追加をオフにしてrack-cors、gemsにCORSのものを処理させます。バム、直した。
ピストス2017年

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

PHPでIISを使用している人は、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サーバーを再起動した後、RUNにIISResetと入力し、


0

CORSがどこにあるかを定義する構成ファイルが1つしかない上記の例と同様の別のインスタンスを次に示します。IISサーバーの異なるディレクトリのパスに2つのweb.configファイルがあり、そのうちの1つが仮想ディレクトリに隠されていました。それを解決するために、パスが仮想ディレクトリの構成ファイルを使用していたため、ルートレベルの構成ファイルを削除しました。どちらか一方を選択する必要があります。

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サーバー)、サーバー側スクリプトを確認し、これらのファイルから不要なエントリヘッダーを削除します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.