web-dev-qa-db-ja.com

PDF ERR_INVALID_RESPONSEの生成結果Chrome

ブラウザで[PHPを介して]プログラムでPDFを生成すると、レンダリングされたPDFはFirefoxとSafariの両方で正常に表示されますが、ChromeはERR_INVALID_RESPONSE有効なPDFです。動作中のブラウザーから保存すると、Adobe Reader/Previewでローカルで開くことができ、Chromeを別のブラウザーから保存すると、PDFで開くこともできます。

PDFファイルはfile_get_contents()を介して読み取られ、現在のタイムスタンプが与えられてからブラウザーに渡されます。回避策としては、ファイルを一時的な場所に保存し、ユーザーをリダイレクトします(少なくともChromeの場合)が、これは理想的ではありません。

私はそれを調査しましたが、 2008年以降のバグレポート しか見つかりませんでした。

私はそれがヘッダーエラーだというインクリングを持っています。 PDFが生成された後、次のヘッダーがブラウザーに送信されます(FF、Safari、およびIEでも正常に動作します)。

    header('Content-type:application/pdf');
    header("HTTP/1.1 200 OK");

Stack Overflowで検索した後、次のヘッダーを追加しようとしましたが、役に立ちませんでした。

    header("Content-Transfer-Encoding: binary");
    header('Accept-Ranges: bytes');

Chromeに必要なヘッダーがありませんか?動的に生成されたPDFをChromeで表示する経験はありますか?

編集:私の最も顕著な質問の1つは、これがChromeでローカルで正常に動作する原因となる可能性がありますが、サーバー環境では動作しません。

12
Andrew Klatzke

皆の回答に感謝したい。

これは、ヘッダーに関連していないことがわかりました。さまざまな方法でヘッダーの変更/削除を試みた後(エンコードの検出、コンテンツの長さの有無による試行など)、より深いhttpdログを掘り下げて、Chromeで異なる解決方法があるかどうかを確認することにしました。

サーバー上のmod_secがファイルインジェクション攻撃の試みとしてリクエストにフラグを立てており(何らかの理由でChromeからのみ)、403禁止応答を返していました。 Chromeは、これを403ではなくERR_INVALID_RESPONSEとして表示しました。

CDNのホスト名がリクエストに存在し(エンドポイントで十分にチェックして、ファイルが実際に許可されたリソースであることを確認しました)、代わりにサーバー上でURLを構築しています。

5
Andrew Klatzke

私の場合、これらの2つのパラメーターをヘッダーに追加する必要がありましたwordpress私のPHP関数のURLを認識します:

header("Content-type: application/pdf",true,200);

これに記載されているとおり wordpress.stackexchangeで回答

これにより、ヘッダーが強制的に(2番目のparam true)wordpress=によって生成された404ステータスコードがカスタムURLを認識せず、200 OK(3番目のparam 200)。

そのため、次のようになりました。

$pdf_name = "test.pdf";
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}";
header('Content-type: application/pdf',true,200);
header("Content-Disposition: attachment; filename={$pdf_name}");
header('Cache-Control: public');
readfile($pdf_file);
exit();
8
Cyberdelphos

これを試して

<?php
$filename = 'Physical Path to PDf file.pdf';
$content = file_get_contents($filename);

header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:inline;filename='".basename($filename)."'");   
header('Content-Length: '.strlen( $content ));

// The PDF source is in original.pdf
readfile($filename);
?>

<html>
<body>
...
...
...

PHPスクリプトの出力がブラウザに送信される前に、上記のヘッダーコードが呼び出されることを確認してください。

6
Alpesh Panchal

皆の回答に感謝したい。

これは、ヘッダーに関連していないことがわかりました。さまざまな方法でヘッダーの変更/削除を試みた後(エンコードの検出、コンテンツの長さの有無による試行など)、より深いhttpdログを掘り下げて、Chromeで異なる解決方法があるかどうかを確認することにしました。

サーバー上のmod_secがファイルインジェクション攻撃の試みとしてリクエストにフラグを立てており(何らかの理由でChromeからのみ)、403禁止応答を返していました。Chromeは、これを403ではなくERR_INVALID_RESPONSEとして表示しました。

CDNのホスト名がリクエストに存在し(エンドポイントで十分にチェックして、ファイルが実際に許可されたリソースであることを確認しました)、代わりにサーバー上でURLを構築しています。

0