我们的Rails Web应用程序使用wkhtmltopdf生成PDF,并将其发送给客户端。我们已经在测试过的每个Web浏览器中尝试了几种不同的响应渲染方式,除了Edge之外都能正常工作。
我们尝试以几种不同的方式呈现响应,以下是最初的方式:
这将打开PDF查看器,我们测试过的所有浏览器都可以正确显示PDF,除了Edge浏览器,它会显示:“某些内容阻止了此PDF的打开。”
在我们的应用程序日志中,有一个POST请求,这是表单提交,我可以看到我们的应用程序发送了pdf文件响应,然后有对表单提交URL的后续GET请求错误,因为它不希望该URL接收任何GET请求。我不知道这里发生了什么。
该请求的响应头如下:
如果我从上面删除
我不认为这是这个问题的重复,因为它在IE 9、10和11中工作正常,只有在Edge中存在问题。
我们尝试以几种不同的方式呈现响应,以下是最初的方式:
kit = PDFKit.new(@html_content)
render text: kit.to_pdf, content_type: 'application/pdf'
这将打开PDF查看器,我们测试过的所有浏览器都可以正确显示PDF,除了Edge浏览器,它会显示:“某些内容阻止了此PDF的打开。”
在我们的应用程序日志中,有一个POST请求,这是表单提交,我可以看到我们的应用程序发送了pdf文件响应,然后有对表单提交URL的后续GET请求错误,因为它不希望该URL接收任何GET请求。我不知道这里发生了什么。
该请求的响应头如下:
Cache-Control: max-age=0, private, must-revalidate
Connection: Keep-Alive
Content-Length: 34865
Content-Type: application/pdf; charset=utf-8
Date: Thu, 18 Jun 2015 14:35:30 GMT
Etag: "4baf297d1866339e60e8e893300909a0"
Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-06-27)
Set-Cookie: _APP_session=<long cookie>; path=/; HttpOnly
X-Request-Id: 617580a8-4d7d-43c4-8e49-aeaeafba7b79
X-Runtime: 21.868098
X-XSS-Protection: 1; mode=block
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-ua-compatible: chrome=1
我也尝试使用 send_data
来实现:
send_data kit.to_pdf, type: 'application/pdf', disposition: 'inline'
这导致以下响应头,但最终仍存在相同的问题:
Cache-Control: private
Connection: Keep-Alive
Content-Disposition: inline
Content-Length: 34866
Content-Transfer-Encoding: binary
Content-Type: application/pdf
Date: Thu, 18 Jun 2015 14:39:42 GMT
Etag: "11db49f1a26444a38fa2b51f3c3336ed"
Server: WEBrick/1.3.1 (Ruby/2.0.0/2013-06-27)
Set-Cookie: _APP_session=<long cookie>; path=/; HttpOnly
X-Request-Id: 501d9832-b07e-4764-8ecc-f1c1e9a6421e
X-Runtime: 7.054236
X-XSS-Protection: 1; mode=block
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-ua-compatible: chrome=1
如果我从上面删除
Content-Disposition: inline
头,则会弹出保存文件提示,下载文件工作正常。但我们需要在浏览器窗口中加载它。我不认为这是这个问题的重复,因为它在IE 9、10和11中工作正常,只有在Edge中存在问题。
Cache-Control
设置为public
,如果仅此不能解决问题,请查看该问题答案中的其他缓存头。 - CBroeCache-Control: private
,这是非常重要的,因为数据非常敏感。另外,我不确定它是否可以被视为那个问题的重复,因为正如所述,这段代码在IE 9、10和11中都能正常工作。 - Mike Campbellpublic
… - CBroe