リクエストヘッダーフィールドAccess-Control-Allow-HeadersはAccess-Control-Allow-Headersでは許可されていません


224

postリクエストでサーバーにファイルを送信しようとしていますが、送信するとエラーが発生します。

リクエストヘッダーフィールドContent-Typeは、Access-Control-Allow-Headersでは許可されていません。

だから私はエラーをググってヘッダーを追加しました:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

次に、エラーが発生します:

リクエストヘッダーフィールドAccess-Control-Allow-OriginはAccess-Control-Allow-Headersでは許可されていません

それで私はそれをググりました、そして私が見つけることができた唯一の同様の質問は半分の答えを提供され、そしてトピック外として閉じられました。追加/削除するヘッダーは何ですか?


これらのヘッダーはサーバーからブラウザーに送信されるため、ブラウザーはJSが応答を解析できるかどうかを決定できます。それらをリクエストに追加しても意味がありません。
pellyadolfo

回答:


189

サーバは、(POSTリクエストが送信されていること)を含む必要があるAccess-Control-Allow-Headersヘッダ(など)、その応答。クライアントからのリクエストにそれらを入れても効果はありません。

これは、サーバーがクロスオリジン要求を受け入れるContent-Typeかどうか(および要求ヘッダーを許可するかどうかなど)を指定する必要があるためです。クライアントは、特定のサーバーがCORSを許可するかどうかを自ら判断することはできません。


5
バックエンドでヘッダーを設定するにはどうすればよいですか?
user3194367 2014

11
@ user3194367:バックエンドによって異なります。
Felix Kling 2014

15
私はサーバー担当者と話をしなければならないと思います。
user3194367 2014

2
response.addHeader( "Access-Control-Allow-Headers"、 "yourKey");
Mayuresh

2
@Mayuresh yourKeyは何ですか?Content-Type
zhuguowei 2016

240

私も同じ問題を抱えていました。私が見つけたjQueryドキュメントで:

クロスドメインリクエストについては、以外にコンテンツタイプを設定するapplication/x-www-form-urlencodedmultipart/form-dataまたはtext/plainサーバにプリフライトOPTIONS要求を送信するために、ブラウザをトリガします。

したがって、サーバーはクロスオリジン要求を許可しますが、は許可しませんがAccess-Control-Allow-Headers、エラーをスローします。デフォルトではapplication/json、角度コンテンツタイプはで、OPTIONリクエストを送信しようとしています。角度のデフォルトヘッダーを上書きするかAccess-Control-Allow-Headers、サーバー側で許可してください。これは角度のサンプルです:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});

28
これは受け入れられる答えであり、他の答えよりもはるかに有益です!
Mike Szyndel 2016年

1
何かを更新したいのでmultipart / form-dataが欲しい
VladoPandžić16年

3
or allow Access-Control-Allow-Headers in server endどうやって?
オマー

1
@omarそれはあなたが使っているサーバープラットフォームに依存します。PHPは、関数名がある場合、Java場合は、他の回答に例があるheader応答の組ヘッダに
フィッシャーマン

1
最後に、2日間の調査の後。感謝の言葉はありません!
Mekey Salaria 2018

51

それが誰かを助ける場合、(これは開発目的でのみ許可する必要があるため、これは一種の貧弱な場合でも)同じ問題が発生したため、ここにJavaソリューションがあります。[編集]ワイルドカードを使用しないでください*これは悪い解決策localhostです。ローカルで何かを実行する必要がある場合に使用してください。

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}

Access-Control-Request-Headersに対する複数の回答に見られるように、異なる環境により明らかに違いがあります。私にとってうまくいったのは、リクエストオブジェクトにアクセスしてヘッダーの値、特に「Access-Control-Request-Headers」のヘッダー値をダンプすることでした。次に、これをコピーしてresponse.setHeader( "Access-Control-Allow-Headers"、 "{paste here}")に貼り付けます。私もJavaを使用していますが、追加の値が必要であり、この回答で言及されているいくつかは不要でした。
ソフトウェアの預言​​者2016年

これは、人々を助け、1年前に手がかりを共有するための部分的(そして言ったように貧しい)ソリューションでした。反対投票の要点はわかりませんが、これはあなたの自由です。アイデアは、サーバー側でヘッダーを許可することです。これにより、OPTIONリクエストが送信されたときに、クライアント/ブラウザーは許可されているヘッダーを認識します。少し混乱があることを認めます。それ以来、私のCORSフィルターは大きく変更されています。より良い方法として、Access-Control-Allow-Originは決して*にしないでください。私の実装では、プロパティによって設定されます。
lekant 2016年

ソリューションは編集され、ベストプラクティスが含まれています
lekant

16

サーバー(POST要求の送信先)は、応答にContent-Typeヘッダーを含める必要があります。

ここに、1つのカスタム「X_ACCESS_TOKEN」ヘッダーを含む、含める一般的なヘッダーのリストを示します。

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

これは、リクエストの送信先のWebサーバーに対して、httpサーバーの担当者が構成する必要があるものです。

"Content-Length"ヘッダーを公開するようサーバー担当者に依頼することもできます。

彼はこれをCross-Origin Resource Sharing(CORS)リクエストとして認識し、それらのサーバー構成の影響を理解する必要があります。

詳細は以下をご覧ください:


13

これを使用して、PHPで適切なヘッダーをアクティブ化できます。

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");

4
あなたの答えが他の答えとどのように異なるか説明してください。コードを投稿するだけではあまり役に立ちません。
oscfri 2018

1
あなたはロックスターであり、残りの答えは技術的な側面を掘り下げています。あなたも私の許可されるべきメソッドを指定することによって私の問題を修正します!
Daniel ZA

1
@DanielZA単にコードを実行させたいので、「技術的な側面を掘り下げる他の答え」の意味を理解していますが、SOは、単に機能しているだけでなく、なぜ機能しているのかを理解する必要があるため、技術的な側面を掘り下げることを意図しています。どのようにして動作させるか。ソリューションにコメントするときは、この動作を推奨しないでください...
nicolasassi

8

以下はnodejsで私のために働きます:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});

Access-Control-Allow-Methodsの順序は重要ですか?
VINI

@vini、私はそれは問題ではないと思います。
Ninja Coding、

4

設定しようとしているヘッダーは応答ヘッダーです。それらは、応答で、要求を行っているサーバーによって提供される必要があります。

彼らはクライアントに設定されている場所がありません。それは彼らがサイトによって付与することができれば、権限を付与する手段を持つ無意味になりたかったデータを所有しているサイトのではなく、許可を。


バックエンドでヘッダーを設定するにはどうすればよいですか?
user3194367 14

@ user3194367 —バックエンドによって異なります。私はあなたがリクエストをしているHTTPサーバーまたはプログラミング言語を知りません。
クエンティン

私はサーバー担当者と話をしなければならないと思います。
user3194367 2014

3

エクスプレスサーバーでこの問題が発生した場合は、次のミドルウェアを追加してください。

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

3

PCまたはMacのChromeでionic2またはangularjs 2の一部のjavascriptリクエストをテストする場合は、クロスオリジンを許可するために、ChromeブラウザーのCORSプラグインをインストールしてください。

mayba getリクエストはそれを必要とせずに機能しますが、postとputsとdeleteは問題なくテストを行うためにcorsプラグインをインストールする必要があります。

また、json応答が何らかのjsonステータスによって400を返さないことを確認してください


3

これはバックエンドの問題です。バックエンドでsails apiを使用する場合は、cors.jsを変更して、ここにファイルを追加してください

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};

3

Aspネットコア、すぐにそれが開発のために働いて得るために、でStartup.csConfigure methodアドオン

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

2

私の場合、@ HeaderParamとしてWebサービスメソッドにいくつかのパラメーターを受け取っています。

これらのパラメーターは、CORSフィルターで次のように宣言する必要があります。

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

2

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-HeadersエラーはAccess-Control-Allow-Origin、HTTPヘッダーのフィールドが処理されないか、応答で許可されないことを意味します。Access-Control-Allow-Originリクエストヘッダーからフィールドを削除します。


2

localhost問題を解決するためにPHPをこれに設定している場合:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type'); 

フロントエンド使用から:

{headers: {"Content-Type": "application/json"}}

そして、ブームからこれ以上の問題はありませんlocalhost

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