2015-10-20 142 views
2

在我的应用程序中的静态文件上传到GCS和设定为公开链接。 当请求的静态资源(在这种情况下,字体)它击中像https://example.com/static/fonts/font.woff 一个URL服务器然后将请求重定向到apropriate GCS URL送达。谷歌云存储字体CORS问题

这里的问题是,与镀铬我得到这个CORS问题:

xxxxxxxxe3b8ccc0e3:1 Font from origin 'https://storage.googleapis.com' has been blocked from loading by Cross-Origin Resource Sharing policy: A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'https://example.com' is therefore not allowed access. 

在桶中的CORS默认值和所有子文件夹设置像这样:

[{"origin": ["*"], "responseHeader": ["Content-Type"], "method": ["GET"], "maxAgeSeconds": 3600}] 

问题是在哪里此凭据标志设置? 我做重定向到公共链接,所以它不是ajax请求,链接是在css文件的font-face声明。

也实在是没有原点设置为域的特定的域或目录,因为我的应用程序是多租户和有访问同一文件的多个不同域的选项。

这似乎当请求来自http正常工作,但给出了这样的错误,当上https 也可正常工作在Safari,但不适用于Chrome。

+0

你是如何加载字体的?你在CSS文档中使用@ font-face吗? –

+0

@BrandonYarbrough是的正确。 '@ font-face {...}' – aschmid00

+0

我无法重现此问题。您可以粘贴您从storage.googleapis.com获得的请求/响应(移除auth的东西?)我创建了一个Web字体,其中包含您创建的确切CORS策略,但未看到此问题:https:// yarbrough-cors -test.storage.googleapis.com/index.html –

回答

2

有趣!有一个Chrome漏洞(问题544879),其中Chrome坚持认为它需要加载字体的凭证,即使它没有。看起来这可能是你的问题。

在等待被固定的错误,你可以考虑这些选项:

  1. 使用HTTP,而不是HTTPS的引用storage.googleapis.com时。 HTTP可能不会受到这个问题的影响。
  2. 在您的CORS策略中列出特定域而不是通配符。
  3. 而不是承载的字体,用@字体面引用它,承载具有编码为数据URI的字体的CSS文件。例如:https://www.filamentgroup.com/lab/font-loading.html
6

当在GCS上托管字体时,此类问题也可能与缺少GCS存储桶上的CORS配置有关。
(见https://cloud.google.com/storage/docs/cross-origin)。

可以定义CORS访问设置有:

gsutil cors set cors-config.json gs://my-bucket 

而且你CORS-config.json可能是,例如:

[ 
    { 
     "origin": ["*"], 
     "responseHeader": ["Content-Type"], 
     "method": ["GET"], 
     "maxAgeSeconds": 3600 
    } 
] 

含义确定所有来源读取。

+0

神圣的废话伙计,谢谢你。作品冠军。 – slumtrimpet

+0

您可能需要重新上传文件桶中的文件,以使其存在CORS标头 –

+0

是否可以为“* .stutzen.co”或“**。stutzen.co”等子域指定通配符? – arvindwill