2017-09-05 11 views
2

httpとhttpsの2つのサイトを処理するnginx設定を作成しようとしていますが、クライアントは両方のサイトにアクセスすることはありませんが、キャッシュ/サイト間の問題がある場合NGINX、ssl、CORS、Access-Control-Allow-Origin値のキャッシュをクロスサイト

だから、
# Allow cross origin 
location ~* \.(eot|svg|ttf|woff|woff2|json)$ { 
    if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) { 
     add_header 'Access-Control-Allow-Origin' "$http_origin"; 
    } 
} 

私がexample.comをロードした場合、すべての作品が、私はadmin.example.comをロードするときに、私は(インデックス)この

ような問題を得る:1のXMLHttpRequestは http://origin.example.com/js/data-lib/currency.jsonをロードすることはできません。 「Access-Control-Allow-Origin」ヘッダーには値「http:// example」があります。 com 'が含まれています。オリジン 'http:// admin。例。 com 'はアクセスが許可されていません。

これはブラウザが元のリクエストをキャッシュしているため、サーバーの別のリクエストが許可されていても拒否されているためです。 Chromeデベロッパーツールでキャッシュを無効にすると、その問題は起こりません。

この問題を解決するにはどうすればよいですか? 1つの設定で複数のドメイン+ SSL/HTTPをすべて実行することは可能ですか?または要求されているドメインとプロトコルに基づいてこれを分割する必要がありますか?

あなたがそのはず、値OriginVaryレスポンスヘッダを追加する場合

答えて

2

(私の例では恐ろしいスペースについては申し訳ありませんが、明らかにStackOverflowのは、私はちょうど例を書いていたときにリンクを投稿しようとしていると考えて) Origin要求ヘッダーの値がキャッシュされた要求の値のOriginの値と異なる場合、ブラウザがキャッシュをスキップして新しいネットワーク要求を行うようにする効果があります。

少なくとも、ブラウザにはthe relevant part of the HTTP specに準拠する必要があります。

だから、これを行うには、あなたのnginxの設定を更新することができます:あなたはthe MDN article on the Vary response headerにより最大読むことができます

# Allow cross origin 
location ~* \.(eot|svg|ttf|woff|woff2|json)$ { 
    if ($http_origin ~* (https?://(admin\.)?example\.com(:[0-9]+)?)) { 
     add_header 'Access-Control-Allow-Origin' "$http_origin"; 
     add_header 'Vary' "Origin"; 
    } 
} 

Vary HTTPレスポンスヘッダは、キャッシュされた応答は、オリジンサーバからの新鮮なものを要求 ではなく、使用することができるかどうかを決定するために、将来の要求に ヘッダを一致させる方法を決定します。 サーバーは、コンテンツネゴシエーションアルゴリズムでリソースを表す を選択するときにどのヘッダーを使用したかを示すためにサーバーを使用します。