代码之家  ›  专栏  ›  技术社区  ›  Chris Dovetail

缓存访问控制允许原点值跨站点

  •  7
  • Chris Dovetail  · 技术社区  · 7 年前

    我正在尝试编写一个nginx配置,它将处理http和https上的两个站点,只要客户端从不访问这两个站点,它似乎就可以工作,但如果客户端访问了这两个站点,就会出现缓存/跨站点问题。

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

    (索引):无法加载1 XMLHttpRequest http://origin.example.com/js/data-lib/currency.json . “Access Control Allow Origin”标头的值为“http://example”。不等于提供的原点。“来源”http://admin。实例因此,不允许访问com。

    我该如何解决这个问题?是否可以在一个配置中完成多个域+ssl/http,或者是否有必要根据所请求的域和协议将其拆分?

    (很抱歉我的示例中出现了可怕的空格,显然StackOverflow认为我在写示例时试图发布链接)

    1 回复  |  直到 3 年前
        1
  •  5
  •   sideshowbarker Miguel Tomás    3 年前

    如果您添加 Vary Origin ,这将导致任何浏览器跳过其缓存,并在 起源 起源

    看见 the relevant part of the HTTP spec

    # 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 .

    变化 HTTP响应头确定如何匹配未来的请求 正在从源服务器请求一个新的。它由 内容协商算法中资源的表示。

    在MDN中 Access-Control-Allow-Origin 文章 CORS and caching 章节:

    访问控制允许原点 作为显式原点的值(而不是“ * “通配符),则响应还应包括 Vary 带有值的响应标头 向浏览器指示服务器响应可以根据 起源

    并且在 the Fetch spec itself :

    访问控制允许原点 * Vary: Origin 响应标题。

    如果 变化 已使用,并且服务器配置为发送 对于仅响应CORS请求的特定资源:当用户代理收到对该资源的非CORS请求的响应时,响应将缺少 访问控制允许原点 访问控制允许原点 .

    更改:原点 在同一场景中使用,它将导致用户代理获取包括以下内容的响应: ,而不是使用来自先前非CORS请求的缓存响应