新标签页超链接到PDF

4
我注意到,如果我创建一个带有target="_blank"的PDF超链接,它无法正确打开。它会打开一个新标签页,但不会加载PDF文件,而只会显示白屏。我使用的是Google Chrome v.43。是否还有人注意到这个问题或者找到了解决方法?
我已经在Safari和Firefox中进行了测试,并且两者都没有任何问题打开PDF文件到新标签页。我还尝试在Chrome中禁用我的插件并使用隐身模式,但没有成功。
测试链接:http://jsfiddle.net/fkfxoho0/
<a href="http://static.googleusercontent.com/media/www.google.com/en/us/webmasters/docs/search-engine-optimization-starter-guide.pdf" target="_blank">Optimization Starter Guide</a>

Chrome v.42的视频以及v.43出现的问题:
https://youtu.be/v_EAedODKfA

1个回答

5
问题似乎是由带有sandbox属性的iframe引起的(例如JSFiddle),因为在这样的iframe之外的链接中不会发生此问题。可以使用以下HTML文件在JSFiddle之外重现此问题。

frame.html:

<iframe sandbox="allow-same-origin allow-forms allow-popups allow-scripts" src="content.html"></iframe>

content.html:

<a href="https://www.adobe.com/enterprise/accessibility/pdfs/acro6_cg_ue.pdf">default</a>
<a href="https://www.adobe.com/enterprise/accessibility/pdfs/acro6_cg_ue.pdf" target="_blank">_blank</a>
<a href="https://www.adobe.com/enterprise/accessibility/pdfs/acro6_cg_ue.pdf" target="_top">_top</a>

使用这些沙盒值, 默认目标_blank_top都无法呈现PDF, 默认在iframe中呈现失败,_blank_top打开新选项卡也失败(由于沙盒化,_top打开新选项卡)。

如果我们添加 allow-top-navigation 沙盒值,我们就可以使_top按预期工作。

<iframe sandbox="allow-same-origin allow-top-navigation allow-forms allow-popups allow-scripts" src="content.html"></iframe>

然而,由_blank打开的新标签仍无法呈现PDF。即使我在MDN上添加了所有放宽沙盒限制的属性,问题仍然存在(并不是我期望添加allow-pointer-lock会有任何作用)。
<iframe sandbox="allow-same-origin allow-top-navigation allow-forms allow-popups allow-scripts allow-pointer-lock" src="content.html"></iframe>

在Chrome 43中,我唯一能让_blank在iframe内工作的方法是完全删除sandbox属性。

<iframe src="content.html"></iframe>

现在默认目标_blank_top按预期工作。

不幸的是,删除sandbox属性并不是一个很好的解决方法。如果您一开始就使用它,那么您可能有需要它的地方。我不能确定在沙盒iframe中阻止PDF文件是否存在安全原因,但是从用户体验来看,我认为这更可能是一个错误。

我已经为这个问题打开了一个bug报告,并链接回了这个问题:

https://code.google.com/p/chromium/issues/detail?id=505860

更新: 原来这是一项设计安全功能,因此它可能不会返回到Chrome 42的行为,但将来可能会添加新的沙箱选项以放宽此安全功能。

更新-2: 允许此功能的沙箱属性是'allow-popups-to-escape-sandbox'。更多信息在这里


我不得不花费无数个小时来研究这个问题。我可以证明,解决这个问题的唯一方法是在CSP头部中使用allow-popups-to-escape-sandbox标志或完全从CSP头部中删除sandbox。太棒了。 - noor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接