web-dev-qa-db-ja.com

Nginxで404応答のクロスオリジンリクエスト(CORS)を許可する

Nginxを使用して、CORSリクエストに応答して静的ファイルを提供します この質問 で概説されている手法を使用しています。ただし、ファイルが存在しない場合、404応答にはAccess-Control-Allow-Origin: *ヘッダーが含まれないため、ブラウザーによってブロックされます。

404応答でAccess-Control-Allow-Origin: *を送信するにはどうすればよいですか?

27
alnorth29

これはずっと前に尋ねられましたが、nginxをより多くのモジュールでコンパイルしていましたが、nginxの新しいバージョンでは、nginxをカスタムコンパイルする必要はなく、alwaysディレクティブを追加するだけで済みました。

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

Alwaysパラメーターが指定されている場合(1.7.5)、応答コードに関係なくヘッダーフィールドが追加されます。

したがって、調整されたバージョンの [〜#〜] cors [〜#〜] ヘッダー:

            if ($cors = "trueget") {
                    # Tells the browser this Origin may make cross-Origin requests
                    # (Here, we echo the requesting Origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_Origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }
38
Arnoldas

私はあなたが現在使用していると仮定しています add_header ディレクティブ。ドキュメントでは、これは200、204、301、302および304ステータスコードのヘッダーのみを設定することに注意しています。 404ステータスコードのヘッダーを設定するには、 more_set_headersheaders_more モジュールからのディレクティブ(このモジュールを取得するには、nginxを再コンパイルする必要がある場合があります)。以下は、すべてのステータスコードのヘッダーを設定します。

more_set_headers 'Access-Control-Allow-Origin: *';

特定のステータスコードに制限することもできます。

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
11
mgorven