web-dev-qa-db-ja.com

リクエストのOriginヘッダーに基づいてnginx Access-Control-Allow-Originを応答ヘッダーに正しく設定するにはどうすればよいですか?

Access-Control-Allow-OriginOriginで受け取った値に設定するnginx構成設定を探しています。

*メソッドはChromeでは機能せず、CORS仕様で許可されていないため、Firefoxでは複数のURLが機能しません。

これまでの唯一の解決策は、Access-Control-Allow-OriginをOriginで受け取った値に設定することです(はい、検証を実装できます)。

問題は、nginxでこれを行う方法であり、できれば追加の拡張機能をインストールしないでください。

set $allow_Origin "https://example.com"
# instead I want to get the value from Origin request header
add_header 'Access-Control-Allow-Origin' $allow_Origin;
24
sorin

ifを使用すると、try_filesなどの他の構成が壊れることがあります。予期しない404になる可能性があります。

代わりにマップを使用

map $http_Origin $cors_header {
    default "";
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_Origin";
}

server {
    ...
    location / {
        add_header Access-Control-Allow-Origin $cors_header;
        try_files $uri $uri/ /index.php;
    }
    ...
 }

悪なら

42
phylae

私はこれを自分で使い始めていますが、これは現在のNginx構成の行です。

add_header 'Access-Control-Allow-Origin' "$http_Origin";

これにより、リクエストのオリジンが唯一許可されたオリジンとして許可されるようにヘッダーが設定されます。だから、あなたがどこから来たのかは、許される唯一の場所です。したがって、「*」を許可することと大差ないはずですが、ブラウザの観点からはより具体的に見えます。

さらに、Nginx設定で条件付きロジックを使用して、許可するホスト名のホワイトリストを指定できます。これが https://Gist.github.com/Ry4an/6195025 の例です。

if ($http_Origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) {
  add_header Access-Control-Allow-Origin "$http_Origin";
}

私は自分のサーバーでこの手法を試し、許可されたドメインをホワイトリストに登録する予定です。

19
Mnebuerquo