FessのStaticテーマで、WebKit系ブラウザではPDFのプレビューやキャッシュ表示が空になる問題がありました。この対策として、テーマ画面が送るContent-Security-Policyのframe-ancestorsを設定できるようにしました。
プレビューが表示されない原因
テーマは取得したファイルやキャッシュをBlobにし、blob: URLのiframeで表示します。WebKitでは、この文書へ親ページのCSPが引き継がれ、frame-ancestors 'none'によって自分のページ内のフレームも拒否されます。ChromiumやFirefoxでは同じ表示が拒否されないため、ブラウザによって差が出ていました。
コンソールにframe-ancestorsに関するBlobの読み込み拒否が出る場合、今回の設定で対応できます。
設定方法
今回の変更を含むFessでは、fess_config.propertiesに以下を指定します。
theme.index.frame.ancestors=
空の値にすると、テーマのHTMLレスポンスからframe-ancestorsディレクティブを省略します。JVMオプションでは次の形です。
-Dfess.config.theme.index.frame.ancestors=
既存の起動オプションへ追加し、変更を反映して再起動します。docker-filesearchにはこの空値の指定を組み込む変更も追加しました。対応前のFessビルドではキーを指定してもプレビュー対策としては機能しません。
デフォルトとフレーム埋め込み制限
デフォルトは従来と同じ'none'です。アップグレードしただけではWebKit向けの挙動は変わりません。
空値でも、同じレスポンスのX-Frame-Options: DENYは維持します。PRのブラウザ検証では、同一オリジン・別オリジンからのページ埋め込みをともに拒否しつつ、Blobのプレビューを表示できることを確認しています。
'self'を指定した場合は意味が異なります。CSPを優先するブラウザでは同一オリジンからの埋め込みを許可するため、プレビュー対策として空値と同じ扱いにはしないでください。
検証範囲
変更の確認はPlaywrightのChromium、Firefox、WebKitで行われています。実機Safariでの検証は含まれません。また、ヘッドレスWebKitではPDFの画面描画そのものを比較できず、PDF文書がフレームに読み込まれることと拒否の解消までを確認しています。
キャッシュ中のbase要素について出る別のCSP警告は、今回の変更の対象外です。表示できない原因がこの設定に該当するか、コンソールのメッセージを確認して適用してください。