2014-08-27 127 views
3

我的子字段中有我的字体,例如static.example.com今天,字体不在Chrome中显示,也在Firefox中显示 - 并且此错误在开发工具中出现:CORS问题请求的资源上没有“Access-Control-Allow-Origin”标头

«来自原始字体'http://static.example.com'的字体已被阻止被跨源资源共享策略加载:在请求的资源上没有'Access-Control-Allow-Origin'标头。因此,原产地“http://example.com”是不允许访问»

我已经有子域中的.htaccess文件

<IfModule mod_headers.c> 
    <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css)$"> 
    Header set Access-Control-Allow-Origin "*" 
    Header set Access-Control-Allow-Headers "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With" 
    Header set Access-Control-Allow-Methods "GET, PUT, POST" 
    </FilesMatch> 
</IfModule> 

而且这个代码,如果我尝试curl -I http://static.example.com/fonts/pfcentrosanspro-reg-webfont.eot在终端,我得到这样的响应:。

HTTP/1.1 200 OK 
Server: nginx 
Date: Wed, 27 Aug 2014 17:20:50 GMT 
Content-Type: font/eot 
Content-Length: 26403 
Connection: keep-alive 
X-Accel-Version: 0.01 
Last-Modified: Mon, 05 Aug 2013 17:49:42 GMT 
Accept-Ranges: bytes 
Cache-Control: max-age=31536000 
Expires: Thu, 27 Aug 2015 17:20:50 GMT 
X-Powered-By: PleskLin 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With 
Access-Control-Allow-Methods: GET, PUT, POST 

但是错误仍然存​​在,我已将字体移至Amazon S3 CDN中的存储桶中并使用以下代码:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
    <CORSRule> 
    <AllowedOrigin>http://example.com</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>HEAD</AllowedMethod> 
    <AllowedMethod>DELETE</AllowedMethod> 
    <AllowedMethod>PUT</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    </CORSRule> 
</CORSConfiguration> 

没有运气,错误仍然存​​在 - 字体无法加载,CORS错误显示 - 我甚至修改了Nginx配置文件而没有结果!

我做错了什么?这让我疯狂。

该网站是W3的总缓存插件WordPress的博客

谢谢您的帮助!

+0

肯定听起来像是一个缓存问题。由于cURL标头是正确的,它们在浏览器请求中也应该是正确的。 Chrome/Firefox中是否禁用浏览器缓存?您可以在Chrome开发人员工具设置中执行此操作。 – rauberdaniel 2014-11-07 19:09:01

+0

您是否找到解决方案? – 2016-12-21 10:39:08

回答

0

有些浏览器不喜欢这样的:

Access-Control-Allow-Origin * 

您应将此设定为始发请求的域名。我在类似的问题上遇到了很多困难,最终落在了下面的解决方案(PHP,但你会明白)。

$origin=isset($_SERVER['HTTP_ORIGIN'])?$_SERVER['HTTP_ORIGIN']:$_SERVER['HTTP_HOST']; 
header('Access-Control-Allow-Origin: '.$origin);   
header('Access-Control-Allow-Methods: POST, OPTIONS, GET, PUT'); 
header('Access-Control-Allow-Credentials: true'); 
header('Access-Control-Allow-Headers: Authorization, X-Requested-With'); 
header('P3P: CP="NON DSP LAW CUR ADM DEV TAI PSA PSD HIS OUR DEL IND UNI PUR COM NAV INT DEM CNT STA POL HEA PRE LOC IVD SAM IVA OTC"'); 
header('Access-Control-Max-Age: 1'); 

此代码将接受来自所有域的所有请求。这可能是不安全的。您可能希望检查针对接受域的白名单的请求。

相关问题