【发布时间】:2021-10-11 13:20:18
【问题描述】:
网上有很多类似的问题,它们似乎都不是完全相同的场景,也没有提供任何关于正在发生的事情或如何解决它的见解。我希望我可以在我的测试中提供更多信息,并缩小我认为正在发生并导致此问题的原因。
我在屏幕上回显和预览通过 SSRS 创建的 PDF 文件,大多数时候我看到的是我明确设置的正确标题,但我有一个似乎会更改内容的报告类型-控制标题。发生这种情况时,Chrome 中的下载按钮将提示下载我的 controller.php 文件而不是 PDF。
我正在使用在 IIS 服务器上运行的 PHP。以下是我在代码中明确设置的标题:
header('content-type:application/pdf');
header('Cache-Control: store; cache; no-revalidate');
header('Content-Disposition: inline; filename=' . $this->sFileName . '.pdf');
对于我输出的大多数报告,标题中的标题与这些值相匹配。以下是正确输出的报价报告示例:
这是单击 Chrome PDF 预览器中的下载按钮时的结果:
在我对多个报告的测试中,有一个特别是订单报告,它似乎总是会更改 Content-Disposition 标头:
这是单击 Chrome PDF 预览器中的下载按钮时的结果:
我运行了一个测试,其中我注释掉了我在上面设置的 Cache-Control 标题行并重新运行了报价报告。我为 Cache-Control 标头获得了与订单报告相同的结果,并且在下载我的 controller.php 文件而不是 PDF 时获得了相同的结果。这就是为什么我认为它与导致此问题的标题有关。没有其他地方我在我的代码中明确设置该标头必须更改它。我希望有人知道一些关于该标头的信息,特别是在 PHP 中可能会导致值发生变化。
提前致谢!
【问题讨论】:
-
看起来请求命中了正在运行的 ASP.net 服务,而是下载了控制器。如果不使用,您应该禁用 IIS...无论发生什么代理,IIS 都具有优先权。 (我的一般猜测)。
X-Powered-By表明两个端点都受到不同服务的影响。如果我不得不从中进行有根据的猜测,服务器上的配置错误似乎是您的问题。 -
感谢您的建议。我删除了 IIS 中的 ASP.NET HTTP 响应标头。它不再出现在 x-powered-by 标头中(现在只是 PHP/7.3.3),但缓存控制仍在更改并且仍然遇到相同的问题。
-
去掉标头并不意味着服务不会被请求击中,你是如何代理请求的? Nginx/Apache2?这是可能的问题。
-
抱歉,服务器配置不是我的专业领域。这是我通过 IIS 在本地托管的开发站点。据我所知,我没有配置代理。
-
我的猜测是 IIS 是你的问题。它代理到您的 PHP 应用程序,而不是转发请求。因此,如果它看到它可以处理的请求,它会处理它而不是传递请求。最好的办法是在本地使用 Apache2 或 Nginx,而不是其他 Web 应用程序。
标签: php google-chrome pdf reporting-services