2017-09-05 45 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响应报头确定如何匹配未来请求 标头,以决定一个缓存的响应是否可以使用,而不是 请求来自原服务器新鲜之一。它被 服务器用于指示在内容协商算法中选择资源的 表示时使用哪个头。