我正在开发一个项目,保护资源(这里:webfonts)是法律要求,CORS被认为是足够的。通过AMP CDN访问受CORS保护的资源似乎是不可能的。
对于受保护的资源,我们针对正则表达式检查Origin:
请求标头,并始终为匹配加上Access-Control-Allow-Origin:
生成匹配的Vary: Origin
响应标头。
本质上(简化,简化示例):
curl -H 'Orgin: https://allowed.domain' -I https://site/.../font.woff2
->
HTTP/1.1 200 OK
Cache-Control: public, immutable, max-age=26680348
Access-Control-Allow-Origin: https://allowed.domain
Vary: Origin, Accept-Encoding
curl -H 'Orgin: https://evil.domain' -I https://site/.../font.woff2
->
HTTP/1.1 200 OK
Cache-Control: public, immutable, max-age=26680348
Vary: Origin, Accept-Encoding
这很简单CORS。
现在,当我针对相应的AMP CDN URL发出相同的请求时......
curl -H 'Orgin: https://allowed.domain' -I https://site.cdn.ampproject.org/r/s/site/.../font.woff2
我看到了一个请求
User-Agent: Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Google-AMPHTML)
从IP解析到google-proxy-*.google.com
,但既没有Origin:
也没有AMP-Same-Origin:
请求标题。然而,我读到https://github.com/ampproject/amphtml/blob/master/spec/amp-cors-requests.md#pseudo-cors-logic的方式我应该至少期待。
如果Origin:以cdn.ampproject.org
结尾似乎并不重要,cdn似乎没有转发它。
因此,如上所述,我们的起源响应200而没有A-C-A-O。
更令人困惑的是,放大器cdn将此响应发送到下游:
HTTP/2 404
access-control-allow-origin: *
x-content-type-options: nosniff
...
那么,CORS如何与AMP CDN上的资源配合使用呢?
这是一个真正的AMP CDN问题。我已经与谷歌的联系人以1:1的比例工作,他们已经解决了这个问题。
此外,我们的起源没有发送Content-Type
响应标头,这是必需的。