Firefox不会在@font-face声明的跨浏览器请求中发送cookie
Firefox doesn't sent cookie in cross browser request declared in @font-face
我想要的:
我需要添加一些动态CSS样式与字体从不同的域,其中需要身份验证,到页面:
问题:
Firefox在字体请求中不发送cookie(在Chrome中一切正常)
:
Firefox v.30.0。CSS文件和字体的来源是在不同的域(在例子中,是外国域名称为"bbb.com")。外部域名"bbb"需要认证。认证成功后,客户端接收到带有php会话ID的cookie,该cookie用于所有其他请求"bbb.com"域。
例子:
- 域名"bbb.com"认证已成功执行
- 通过AJAX请求url"https://bbb.com/issue2604dead.css"客户端接收CSS文件的内容,如字符串
- Javascript创建具有上一步接收到的内容的元素
- CSS样式工作正常,受影响元素的样式被改变;
- CSS中的定义之一是以下字体参考:
@font-face{font-family:dead_3;src:url(https://bbb.com/dead_3.ttf)format("opentype");}
- 浏览器试图从url获取字体,但客户端收到响应状态为"401未经授权";
编辑:
我在jsFiddle上做了一个例子:http://jsfiddle.net/RightFiveLeft/Pu4C2/9/
我发现Firefox没有发送Cookie,因为引用设置在DOM元素中。如果你通过ajax加载相同的资源,浏览器将发送cookie.
所以在我的例子jsFiddle Cookie将不会发送的CSS请求创建的DOM元素链接。
编辑2
对不起,我在jsFiddle中添加了错误的示例。现在在版本9中,它应该是正确的:-D
你说得对,确实有些奇怪。在Safari(7.0.5)中,css和字体请求都返回401。如果在新的Safari选项卡中打开字体或css请求,它将返回401。如果现在再次刷新,两个请求都可以正常工作(200)。
在firefox(31.0)上,字体问题仍然存在。这可能是firefox对其他域请求的策略,或者…只是一个bug。
我发现了一些可能相关的东西,但需要访问web服务器来测试它:CSS @font-face不能在Firefox中使用,但可以在Chrome和IE中使用
顺便说一下,看起来即使在其他浏览器中,这些请求的实现也存在一些差异和问题,所以我不会太依赖cookie的身份验证机制。
另一种方法是稍微改变getFile.php
的实现,接受GET
参数(令牌)进行身份验证。例如,您可以将请求制作为:
.../getFile.php?fileName=testFont.ttf&_=1445&token=<auth token>
并测试针对$_GET['token']
的认证参数,而不是cookie值。
如果你不能或不想用这种方式解决,我建议你评估一下(只)保留字体而不进行身份验证的可能性。如果这是一个可行的解决方案,最好的选择是从CDN提供。
- 防止“;jQuery(html)"防止触发浏览器请求图像和其他参考内容
- Chrome浏览器“;挂起”;同时在循环中执行AJAX请求
- 为什么我从浏览器修改html/js时会多次发送ajax请求
- 如果不刷新Rails中的浏览器,AJAX请求就无法看到效果
- 使用Javascript的Ajax请求在iPhone浏览器中不起作用
- HTTP请求使用cURL,但在浏览器中使用javascript时会得到CORS响应
- Web 工作线程中的同步 XHR 请求是否仍会锁定浏览器
- 谷歌cookie是否存在于chrome,火狐,即在phantomjs中发出某些请求时发送的浏览器
- 当按下浏览器后退按钮时,如何用相同的post参数激发ajax请求
- 在浏览器上不打开url的情况下自动请求
- 当我们打开ADF应用程序的同一网页的不同版本时,如何让浏览器请求java脚本
- 在Node.js和浏览器上拦截(mock)http请求
- 当浏览器请求部分内容范围请求时,如何检测pdf何时加载到iframe中
- 浏览器不发送 CORS HTTP 选项用于发布请求
- 减少请求的文件大小或减少浏览器计算次数
- 如何在浏览器中压缩json请求数据
- 跨源请求被POST阻止,但浏览器上的req可以正常工作,但设备上不工作
- 是否有任何事件在浏览器请求另一个资源(如图像)之前触发
- AJAX-如何在不冻结浏览器的情况下逐个发出异步请求
- 用于导出到CSV/Excel的数据URI(无服务器端请求):浏览器支持/限制