ダウンロードする前にファイルを単純なフォームにリダイレクトします
質問
こんにちは。サイト内の PDF ファイルへのすべてのリンクを、PDF のダウンロード/表示に進む前にユーザー情報を収集するフォームのあるページにリダイレクトしようとしています。
例えば
Web サイトの *.pdf ファイルを request.php?file=name_of_pdf_being_redirected にリダイレクトしたい
ここで、 request.php は、続行する前にいくつかの詳細を求めるフォームが含まれるページです。
サイト内のすべての PDF は /pdf フォルダー内に保存されます。
何か案は?
編集:申し訳ありませんが、サーバーで Apache を使用しています。
よし、着くよ:私は現在それを使用して動作させています:
書き換え ^pdf/(.+。pdf)$ request.php?file =/$ 1 [r
しかし、今度は、ダウンロードページに移動して、その人に実際にファイルをダウンロードさせたいときに、私の新しいルールは、ダウンロードリンクをフォームに吐き戻すことです:-Pははは、とにかく、フォームが完了したらファイルをダウンロードさせることはできますか?送信されていて、download.php にアクセスしていますか?
解決
これを試すことができます:
- ファイルを Web ルートの「外側」のフォルダーに移動し、誰もブラウザ経由でファイルにアクセスできないようにします。
- セッションを使用して、ユーザーがフォームに記入したかどうかを検出します
- PHP を利用したファイル ダウンロード スクリプトを使用します。最も単純な形式では、次のようになります。
if ( isset( $_SESSION[ 'OK_TO_DOWNLOAD' ] ) == false ) { header( "Location: must_fill_this_first.php" ); exit( 0 ); } header( "Content-type: application/pdf" ); // double check the above, google it as i am not sure echo file_get_contents( 'some_directory_inaccessible_thru_www/' . $_GET[ 'pdf_name' ] ); // ideally a binary-safe function needs to be used above
これは私がウェブサイトで使用した、実証済みのテクニックです。コード例はドラフトの概要であり、改良が必要です。
他のヒント
アイデアは?まず、使用している Web/アプリ サーバーを教えてください。役立つかもしれません :-)
Apache では、RewriteRule を使用してリクエストを別の形式に変換できる必要があります。たとえば、回転する /pub/docs/x.pdf
の中へ request.php?file=/pub/docs/x.pdf
次のようなもので行うことができます:
RewriteRule ^/pdf/(.*)\.pdf/ request.php?file=/$1.pdf
これは記憶によるものであることに注意してください (Apache を触ってから 6 年が経ちますが、まだきれいです :-)、形式は若干異なる可能性があります。
アップデート:
これで問題は解決しました。次の問題に対するいくつかのオプションを示します。
1/ PDF が書き換えルールに引っかからないように、PDF の名前を別の拡張子に変更します。クライアントが選択したビューアで開くように、同じ MIME タイプをクライアントにプッシュするように構成する必要があります。
2/ PDF への直接アクセスとしてではなく、スクリプトの一部としてダウンロードも実行します。フォームの送信は HTTP リクエストであるため、PDF コンテンツをリダイレクトするのではなく、即座に PDF コンテンツで応答できる必要があります。 また ダウンロードページへ。
2 番目のオプションは次のような理由から私の選択です。
- xx.pdf の代わりに xx.pdfx をリクエストするだけで PDF にアクセスできると人々が思いつくのを防ぎます。
- これにより、ユーザーは PDF をより迅速に取得できるようになります (リンクを再度クリックする必要がなくなります)。
注、私の答えは、.NET Webサイトに関してですが、私は、同じ構築物はPHPのどこかに存在すると確信しています。
私は単純に(私の場合のrequest.aspxに)request.phpするResponse.Redirectを?...などを行います* .PDFのパスでHttpModuleをを持っているし、ボタンのイベントハンドラでをクリックしますあなたが表示され、それらが権限を持っていることをするためにどのPDF知っているページ、単純なResponse.ContentTypeの= [PDFのMIMEタイプ]、その後、Response.WriteFile(PDFファイル)、そして最後にResponse.Endの()を実行します。
などのファイルサイズ、あなたはそれを改善するために追加することができます他のものがありますが、しかし、最小限の場合には、これは動作します。あなたはC#で、それ用のコードをしたい場合私は約3分で何かを思い付くことができますが、PHPで私はかなり迷ってしまいました。私はのHttpModulesとどのようにPHPでそれらを記述する方法を探して起動すると思います。
"PHP HttpModuleを" のためにグーグルでは、これにつながる:ASP.NETの等価をHttpModules PHPでそう、私は少し間違っているかもしれませんが、うまくいけばそれが出発点だます。
.htaccessファイルを使用してください。あなたはmod_rewriteを有効にしていることを確認してくださいする必要がありますが、あなたが一度あなたがこれらの二つのシンプルなラインを使用して、すべてのファイルを書き換えることができます:
RewriteEngineオン するRewriteRule ^ .PDF $ /rewrite.php [NC、L]
はIISを使用している場合は、ISAPI_Rewriteを使用して似たような達成することができます。
あなたの他の代替は、<。公にアクセスすることはできませんし、その後、PDFリソースに対して行われたすべての要求がアクセス拒否エラーを返すとファイルが唯一の適切なダウンロード・スクリプトを介してアクセスすることができ、ディレクトリのあなたのPDFファイルの内部を配置することです/ P>
if($user==authenticated){
//set pdf headers
echo file_get_contents('actual.pdf');
再書き込みなしmodが、実際のソースを隠していないと私は通常、何をすべきかである - これは
役に立てば幸い