IIIFでフルサイズ画像ダウンロードをさせないためのお手軽設定

 IIIFの導入にあたって、「画像ダウンロードさせたくない」という理由で反対されるケースが未だにそこここで聞かれるという話をうかがいましたので、簡単ソリューションを考えてみました。

 この件は、そもそも画面キャプチャをすれば画像入手はできてしまうというという前提を共有できるはずなので、分割画像をダウンロードして自分で組み合わせるという人は画面キャプチャと同様であると考えることにして(それでいいのかという話もありますが…)先日このブログでご紹介したような、あるいは、otani0083 さんがGUIで作ってくださったようなダウンローダーなどで簡単に大きなサイズの画像ダウンロードをできないようにする、ということを目指してみます。

 今回の条件は、.htaccessを許容するapache2.4系のサーバで動いているIIP Image Serverです。.htaccessを許容しなくても直接httpd.confに書き込むことができるならそれでもよいかと思います。

 さて、フルサイズ画像や大きなサイズの画像ダウンロードをさせないということをIIIF Image APIとして考えてみると、画像サイズをURIで指定する箇所がありますので、そこで、禁止したいサイズの画像アクセスURIが来た場合には書き換えてしまえばいいということになります。普通にビューワ上で大きな画像を表示したいときは分割画像で送出することになりますので、その分割サイズよりも大きなサイズであれば禁止してもあまり問題はありません。分割画像のサイズとしては、256x256や512x512が多いように思われます。(時々一辺1000ピクセル以上の分割画像を見ることもありますが。)そこで、とりあえず一辺600ピクセル以上の画像を要求された時は256x256の画像を返戻してしまうようにすることを考えてみます。

 これは、Apacheだとごく基本的な機能の一つですね。mod_rewriteの機能を使います。.htaccessを使えるのであれば、iipsrv.fcgiの置いてあるディレクトリに以下のような.htaccessファイルを置いたらできました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} iipsrv.fcgi
RewriteCond %{QUERY_STRING} ^IIIF=(.*)/!?(([6-9][0-9]{2}|[0-9]{4,}|),([6-9][0-9]{2}|[0-9]{4,}|)|full)/([0-9]+/default\.jpg)$
RewriteRule ^.*$ iipsrv.fcgi?IIIF=%1/!256,256/%5
</IfModule>

これは、以下のようなパターンのURIを前提としています。

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/1000,/0/default.jpg

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/full/0/default.jpg

 

上の.htaccessでの設定を介すると、上記のImage API URIが以下のようになります。

https://candra.dhii.jp/iipsrv/iipsrv.fcgi?IIIF=/kakouzou_pub/021_1/0002s.tif/full/!256,256/0/default.jpg

 

ちょっとベタな書き方になっていますが、とりあえずこれでなんとかなりました。ディレクティブや記号の意味はググっていただけば色々出てきますので詳しくはそちらを参照していただくとして、基本的な流れとしては、まず、RewriteCond %{REQUEST_URI} iipsrv.fcgi のところでIIP Image Serverへのアクセスのみを対象にします。次に、ここのサーバはIIP Image Serverのデフォルト設定のままで、Image URIのパラメータ指定がクエリ文字列(URI中の?より後ろ)になってしまっていますので、mod_rewriteでは普通に変換することはできません。そこで、次のRewriteCond では%{QUERY_STRING}という変数を用いてクエリ文字列を正規表現マッチさせます。(文字列一致で600以上を表現しようとしているのですごくベタになってしまっていますがご容赦ください。もっと良い書き方もあると思いますのでぜひご検討ください。)その次に、置換したい文字列を後方参照(ここでは%1 や%5)も含めてRewriteRuleのところで記述します。

 すごく拍子抜けしてしまう人もいるかもしれませんが、これだけで「大きなサイズの画像は分割画像の組み合わせで見せつつ、1辺600ピクセル以上の画像を丸ごとダウンロードさせない」ことができてしまいます。何か穴があるかもしれませんので、お気づきの方はぜひお知らせ&改良していただければと思います。

 IIP Image Serverでは、もしかしたらこれを自身の設定でできるかもしれませんが、設定パラメータをざっと見た限りではうまくみつけることができなかったので、Apacheの設定ファイルで対応してみました。Apacheに限らず、WebサーバのレベルでURLの置換はできる場合がありますし、URLでImage API URIを書き換えるという話ですので、IIP Image Serverだけでなく、IIIFのImage serverをWebサーバ経由で利用しているところでは、同様に対応可能だと思いますのでぜひトライしてみてください。

 あるいは、Image Server側を色々いじってこういうことができるようにするという手もあり得ますが、サーバソフトがセキュリティアップデートをした時等にとても大変なことになってしまう上に引き継ぎも難しいので、比較的安定していて引き継ぎしやすい.htaccessファイルでできるのであればそれにこしたことはないでしょう。

 このことからわかるのは、認証に関することも同様にhttpdのレベルでラッパーをかませれば割と簡単に実現できるだろう、ということです。それについても、ニーズはかなりありますので、いずれちょっとやってみる予定です。(が、どなたかやってみて手法を公表していただけると大変ありがたく・・・)

 もちろん、オープンサイエンス・オープンデータといった観点、あるいは単に文化を広くひらいていくという観点からも、このようなことはまったく好ましいことではありません。画像を丸ごとダウンロードできるようにしておくことは、利便性向上だけでなく、データ保全の観点からも極めて重要です。また、結局、画面キャプチャすればつなげることができてしまいますので本当に意味があることなのかどうかは気になるところです。ただ、所蔵者・公開者の方々の中には、とにかく画像丸ごとダウンロードはさせたくない、という人がおられるようですので、そういう方々にIIIFへの対応を前向きにご検討していただく上で多少お役に立つことがあるソリューションかもしれないと思います。何事もステップというものがあり、一つずつ、少しずつ、心理的障壁を取り除き、それによって利便性が高まったり有用性がより広く認知されたりするという体験から理解を深めていただけることも少なくありませんので、そういうステップの一つとして捉えることはできるだろうと思います。