PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

PDFをウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」

こんな依頼を受けることが結構あります。

この要望が必要な場面は、

  • 利用規約ページは必ず見て欲しい
  • ユーザーに何らかアクションをしてもらった特典としてPDFを閲覧してもらいたい

などが挙げられますね。

毎回どうやって作ったか思い出しながらやっているので、今日は備忘録として上記要望の実装方法をまとめます。

PHPと.htaccessを利用してPDFの閲覧を制限する

閲覧制限といっても、閲覧するためにIDやパスワード求めるわけではなく、特定ページ経由のときにのみPDFが表示されるようにする仕様です。

通常ウェブサイトにPDFを置いて閲覧させる場合は、下図のようにHTMLにPDFへのリンクを設置して、ユーザーがクリックするとPDFが表示されるようにしますよね。

PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

ただ、このままでは誰でも閲覧できる状態です。
ここに制限を設けます。

仕様としては、

  • PDFはURL直接入力や直リンクで閲覧できないように.htaccessを利用して閲覧を制限する
  • 特定のページからのアクセスの場合のみ、PDFを表示する

となります。

実装方法

使用するファイルは下記の4つです。

PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

  • .htaccess – PDFへの直接アクセスを制御
  • checkPermission.php – 特定ページからのアクセスかを判断。OKの場合PDFを出力。
  • index.php – PDFへのリンクを貼る画面
  • test.pdf – 表示するPDF

※今回は同階層にすべて置いてあります。

これらのファイルを用い、下図のような仕組みを実装します。

PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

今回使ったコードをまとめていきます。

.htaccess – PDFへの直接アクセスを制御

まずは.htaccessを利用してPDFへのアクセスを拒否します。

<Files ~ "\.(pdf)$">
deny from all
</Files>

今回はPDFの制御をしましたが、別のファイルを制御することも可能です。

<Files ~ "\.(pdf|●●●)$”>
deny from all
</Files>

●●●の部分をtxtなど別の拡張子にします。

ブラウザに直接PDFへのURLを入力して確認します。

表示できていたPDFが”Forbidden”となっていれば正しく動作しています。

PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】

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をウェブサイトに置いてユーザーに閲覧させたいけど、特定のページを経由しないと見れないようにしたい」という要望のプログラムの実装が完了です。

同じような案件でお役に立てば幸いです。

コメントを残す

*