WordPressで製作する会員サイトにおいてPDFファイルをログインユーザーしか見られないようにという依頼がありました。
PDFファイルのURLを直接たたかれると表示されてしまうのはマズいということで以下の方法で対応した。
概要
方法1:
文書(PDF)に直接アクセスできないように.htaccessに記述を加える
方法2:
記事ページに設置してある文書(PDF)のリンクをクリックしないとPDFを開けないようする
これにより以下2点をクリアしないと文書(PDF)の閲覧ができないようにした。
文書(PDF)を開いた後は印刷するなり保存するなり自由となる。
・ログインしている会員
・記事ページを経由している
上記2点をクリアしてない場合や直接URLにアクセスしてきた場合に403エラーが表示される。
実装にあたり用意するのは以下ファイル
・.htaccess
・single.php
・check.php
・sample.pdf
用意
PDFファイル(sample.pdf)とcheck.phpは同じディレクトリ内に置く
今回はテーマファイル内に設置した
※これ重要
実装1:PDFファイル(sample.pdf)に直接アクセスできないように.htaccessに記述を加える
編集するファイル
.htaccess
以下の内容を書き加える
1 2 3 |
<Files ~ "\.(pdf)$"> deny from all </Files> |
実装2:セッションで記事ページを介さないとPDFを開けない
編集するファイル
single.php
▼暗号を仕込む
<?php get_header(); ?>の上に以下の内容を書き加える
1 2 3 4 5 |
<?php //セッション開始 session_start();//セッション値設定 $_SESSION{'flg'}= "ok"; ?> |
▼暗号が合っているか確認するページ(check.php)へのリンクを設置
1 |
<a href="<?php echo get_template_directory_uri(); ?>/check.php" target="_blank"><?php echo get_template_directory_uri(); ?>/check.php</a> |
実装3:記事ページからのアクセスかを判断するページを作成
作成するファイル
checkn.php
◆暗号が合ってるか確認する
暗号があっていたらPDFを開く
「flg」の暗号が「ok」だったらPDFを開くってイメージ
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php //セッション開始 session_start(); if(isset($_SESSION{'flg'}) && $_SESSION{'flg'} == "ok"){ //PDF出力 header("Content-Type: application/pdf"); readfile(dirname(__FILE__) . "/sample.pdf"); }else{ print "不正アクセス"; } ?> |
以上のことにより文書(PDF)ファイルに制限をかけることができた。
ここからの課題
ここから文書(PDF)をどんどん登録していった時の対応になる。
こちらについては実装をしていないが、以下の方法で対応可能と思っている。
①文書PDFを格納するディレクトリを1つとし、そこに格納されるようにする
②文書PDFと同じ場所にcheck.phpを設置する
③記事一覧ページのリンクURLにパラメータをつける
④パラメーターをsingle.php→check.phpと経由させファイル名を動的にする
以上
補足
以下ページを参考にするとPDFのダウンロード制限方法も知ることができます。
PDF等閲覧制限 特定ページ経由からのみ閲覧可能に【PHP・htaccess】
https://taupe.site/entry/pdf-php/
(WordPress)PHP、ファイルの直リンクやURL直接入力での参照を禁止する(リファラを見ないやり方)
http://xidear.com/xidear/urawaza/pdf_akusuhuka.html