「PDFをウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」
こんな依頼を受けることが結構あります。
この要望が必要な場面は、
- 利用規約ページは必ず見て欲しい
- ユーザーに何らかアクションをしてもらった特典としてPDFを閲覧してもらいたい
などが挙げられますね。
毎回どうやって作ったか思い出しながらやっているので、今日は備忘録として上記要望の実装方法をまとめます。
PHPと.htaccessを利用してPDFの閲覧を制限する
閲覧制限といっても、閲覧するためにIDやパスワード求めるわけではなく、特定ページ経由のときにのみPDFが表示されるようにする仕様です。
通常ウェブサイトにPDFを置いて閲覧させる場合は、下図のようにHTMLにPDFへのリンクを設置して、ユーザーがクリックするとPDFが表示されるようにしますよね。
ただ、このままでは誰でも閲覧できる状態です。
ここに制限を設けます。
仕様としては、
- PDFはURL直接入力や直リンクで閲覧できないように.htaccessを利用して閲覧を制限する
- 特定のページからのアクセスの場合のみ、PDFを表示する
となります。
実装方法
使用するファイルは下記の4つです。
- .htaccess – PDFへの直接アクセスを制御
- checkPermission.php – 特定ページからのアクセスかを判断。OKの場合PDFを出力。
- index.php – PDFへのリンクを貼る画面
- test.pdf – 表示するPDF
※今回は同階層にすべて置いてあります。
これらのファイルを用い、下図のような仕組みを実装します。
今回使ったコードをまとめていきます。
.htaccess – PDFへの直接アクセスを制御
まずは.htaccessを利用してPDFへのアクセスを拒否します。
<Files ~ "\.(pdf)$"> deny from all </Files>
今回はPDFの制御をしましたが、別のファイルを制御することも可能です。
<Files ~ "\.(pdf|●●●)$”> deny from all </Files>
●●●の部分をtxtなど別の拡張子にします。
ブラウザに直接PDFへのURLを入力して確認します。
表示できていたPDFが”Forbidden”となっていれば正しく動作しています。
index.php – PDFへのリンクを貼る画面
次にPDFへのリンクを設置するページの作成をします。
ここではPHPでセッションを開始し、$_SESSION[‘permission’]に’true’という文字列を持たせます。
<?php session_start(); $_SESSION['permission']= 'true'; ?> <p><a href="checkPermission.php" target="_blank">こちら</a>からPDFをダウンロードできます</p>
この’true’が設定されているかどうかがこの後の判断材料となります。
リンク先は特定ページからのアクセスかを判断するPHPにしておきましょう。
checkPermission.php – 特定ページからのアクセスかを判断。OKの場合PDFを出力。
index.php内のリンク先がこのPHPファイルになります。
$_SESSION[‘permission’]に’true’が入っているかを確認し、入っている場合はPDFを出力します。
ここではPDFは同階層にあるtest.pdfを想定しています。
<?php session_start(); if (isset($_SESSION['permission']) && $_SESSION[‘permission’] == 'true'){ header("Content-Type: application/pdf"); readfile(dirname(__FILE__) . "/test.pdf"); } else{ //不正アクセスの場合の対処を記述 } ?>
$_SESSION[‘permission’]に’true’が入っていない場合はelse内の対処になります。
“//不正アクセスの場合の対処を記述”の部分にはお好きな処置を書いてください。
もし、PDFを出力するのではなく、ダウンロードさせたい場合は、
header("Content-Type: application/pdf");
を
header("Content-Disposition: attachment; filename=test.pdf");
に差し替えてください。
ただ、この対応の場合はPC以外のスマートフォンなどではエラーになってしまいますのでお気をつけください。
まとめ
以上で、「PDFをウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」という要望のプログラムの実装が完了です。
同じような案件でお役に立てば幸いです。
コメント