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


26

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

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

回答:


35

これはずっと前に尋ねられましたが、私は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;
            }

2
alwaysキーでした。これを指摘してくれてありがとう、私は怒っていた!
bgondy

11

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

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

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

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