Drupal ユーザーの間では常識かもしれないが、先日の移行作業で実際に使う機会があったのでメモ。
画像スタイルによる加工画像の URL に付加されるクエリパラメータ(トークン)を解除するには、settings.php 等で次の設定を行う。
$config['image.settings']['allow_insecure_derivatives'] = TRUE;
$config['image.settings']['suppress_itok_output'] = TRUE;
Insert モジュールでコンテンツ中に埋め込んでいた加工画像が、移行後のサイトで軒並み表示できなくなり焦ったが、この設定で表示を復元した。
解説
Drupal の画像スタイルを使用すると、サイズ変更をはじめとする様々な加工処理をオンデマンドで実行してくれる。たとえば、アップロードした画像ファイル view.jpg を元に、異なる複数のサイズの画像を生成して取得できる。
事前に構成した画像スタイルの名前(thumbnail、medium、large)を含むパスの画像 URL をリクエストすることで、対応する加工処理を起動し、生成後のファイルがレスポンスとして返ってくる仕組み。
ところで、上のサンプルの画像 URL を見てみると、クエリパラメータ(トークン)が付加されていることがわかる。
- files/styles/thumbnail/private/2021-01/view.jpg?itok=7x_NMciE
- files/styles/medium/private/2021-01/view.jpg?itok=eWeETG3S
- files/styles/large/private/2021-01/view.jpg?itok=jPRhbP_6
このトークンは、画像の加工処理リクエストを浴びせかける DoS/DDoS 攻撃の脆弱性を修正する目的で Drupal 7.20 のときに導入された。これにより、Drupal API で生成したサイト固有のトークンを URL に指定しないと、加工処理の呼び出しも、また加工後の画像を取得することもできなくなった。試みに、このクエリパラメータを削除してみると、レスポンスが 404 になることがわかる。
- files/styles/thumbnail/private/2021-01/view.jpg
- files/styles/medium/private/2021-01/view.jpg
- files/styles/large/private/2021-01/view.jpg
その後、これが CDN との連携や加工後の画像パスを含むコンテンツ移行等で問題を引き起こすという指摘から、必要に応じて無効化できるオプションが Drupal 7.21 で導入された。これが冒頭記した設定で、今回 Drupal 9 でも使えることが確認できた。
なお、itok トークンを無効にした場合に DoS/DDoS 攻撃が問題になる環境では、対策を別に考える必要がある。
参考資料
- Why are tokens added to image URLs?(Drupal Answers)
- How do I remove the itok token from the image URLs?(Drupal Answers)
- public function ImageStyle::buildUrl(api.drupal.org)