2017-09-05 46 views
2

我想寫一個nginx配置,它將處理http和https上的兩個站點,它似乎只要一個客戶端永遠不會訪問這兩個站點,但如果他們確實存在緩存/跨站點問題。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://示例。 com'不等於提供的原點。 Origin'http:// admin。例如。 com'因此不被允許訪問。

就在我可以告訴這是因爲瀏覽器緩存了原始請求與它的頭部,現在它拒絕我,即使服務器的另一個請求將允許它。證明是,如果我在Chrome開發人員工具中檢查Disable Cache,那麼問題就不會發生。

我該如何解決這個問題?是否有可能在一個配置中執行多個域名+ ssl/http全部,還是有必要根據請求的域名和協議將其分開?

(很抱歉,在我的例子可怕的空間,顯然StackOverflow上認爲我想發佈鏈接時,我剛寫的例子)

回答

2

如果用價值Origin添加Vary響應頭,這應該當Origin請求標頭的值與其緩存的請求的Origin值不同時,會導致瀏覽器跳過其緩存併發出新的網絡請求。

至少它應該在瀏覽器中符合the relevant part of the HTTP spec的效果。

所以,你可以更新你的nginx的配置做到這一點:

# 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"; 
    } 
} 

您可以在the MDN article on the Vary response header更多閱讀起來。

Vary HTTP響應報頭確定如何匹配未來請求 標頭,以決定一個緩存的響應是否可以使用,而不是 請求來自原服務器新鮮之一。它被 服務器用於指示在內容協商算法中選擇資源的 表示時使用哪個頭。