はじめに

Apache2 + PHP でウェブサーバを立てている状況で、非公開ディレクトリ(パブリックでないローカルのディレクトリ)の画像を読み込んで表示する方法を調べた。

※「画像は表示したいが、画像ファイル自体は公開ディレクトリに格納したくない」のような特殊なケース

TL;DR

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 18.04.2 LTS"

$ php -v
PHP 7.2.24-0ubuntu0.18.04.1 (cli) (built: Oct 28 2019 12:07:07) ( NTS )

$ apache2ctl -v
Server version: Apache/2.4.29 (Ubuntu)

詳細

以下を組み合わせると OK。

1
2
3
4
5
6
<?php
$img_base64 = base64_encode(file_get_contents('/path/to/image'));
$img_info = getimagesize('data:application/octet-stream;base64,' . $img_base64);
$img_src = 'data: ' . $img_info['mime'] . ';base64,' . $img_base64;
?>
<img src="<?php echo $img_src; ?>">

ちなみに getimagesize で取得できる情報は下記。

1
2
3
4
5
6
7
8
9
<?php echo var_dump($img_info); ?>
// => array(6) {
// [0]=> int(369)
// [1]=> int(299)
// [2]=> int(3)
// [3]=> string(24) "width="369" height="299""
// ["bits"]=> int(8)
// ["mime"]=> string(9) "image/png"
// }

まとめ

その他・メモ

公開ディレクトリに置くけど、自サーバからのみアクセス可(外部サーバからのアクセスは拒否)とする場合は、下記の設定を行う。
参考: Apacheで画像などのリソースを直リンクさせない設定を行う(SetEnvIf + Referer)

/etc/apache2/apache2.conf

1
2
3
4
5
6
7
8
# Deny direct access to images
SetEnvIf Referer your\.domain\.com allow_xxxx

<FilesMatch ^.+\.(png|gif|jpg|jpeg|heic)$>
order deny,allow
Deny from all
Allow from env=allow_xxxx
</FilesMatch>

参考文献

関連記事