Fessのキャッシュ表示で相対URLの画像とリンクを解決する

FessのbootstrapテーマでキャッシュしたHTMLを表示すると、相対URLの画像やリンクが元サイトへ解決されない問題を修正しました。キャッシュ表示の中でURLを元ページのアドレスに基づいて変換し、画像などの参照先を正しく組み立てます。

base要素が効かない理由

キャッシュビューアーはHTMLをsandbox付きのBlobフレームへ入れます。その文書に親ページのContent-Security-Policyが引き継がれ、base-uri 'self'によって元ページを指定するbase要素が無視されていました。ブラウザのコンソールにbase-uriの違反が出て、画像やリンクの相対アドレスがBlobを基準に扱われます。

今回の修正ではbase要素を取り除き、HTMLのhref、src、srcset、ポスター画像、背景画像などの参照を、APIが返した元ページURLで解決してから表示します。たとえば元ページがhttps://example.com/docs/page.htmlなら、img/photo.pngはhttps://example.com/docs/img/photo.pngになります。

利用条件と初期値

新しい切り替え設定はありません。修正を含むbootstrapテーマと、元ページURLを持つHTMLキャッシュが必要です。別配布のテーマや独自テーマは、そのテーマに対応する修正を確認してください。

本体の文書キャッシュ設定はcrawler.document.cache.enabled=true、対応MIMEタイプはcrawler.document.cache.supported.mimetypes=text/htmlが初期値です。最大サイズの初期値はcrawler.document.cache.max.size=2621440バイトです。実際に対象文書のキャッシュが保存されている必要があり、設定を有効にするだけで過去の文書へ本文が追加されるわけではありません。

元URLを返す既存HTMLキャッシュのURL解決だけなら再クロールで作り直す処理ではありません。修正版でキャッシュ画面を再読み込みし、元サイトにある画像が取得できるか確認します。

元ページと同じ表示にはならない

CSPやフレームのsandbox制限は維持します。元サイトの外部スタイルシート、フォント、メディア、object、埋め込みフレームは引き続き拒否されることがあります。画像や背景画像のURL解決が改善されても、元ページのデザインや動画をそのまま再現する機能ではありません。

フレーム内の通常リンクは、遷移先がframe-src blob:に合わず拒否される場合があります。target="_blank"のリンクは元URLを別タブで開けます。元URLがない場合は変換せず、ページ内アンカーや既に絶対URLの参照も維持します。

WebKitでBlob自体が空になる問題を扱うtheme.index.frame.ancestorsとは原因が異なります。今回の相対URL修正のためにCSPを緩める設定は必要ありません。修正PRのブラウザ確認はChromiumとFirefoxで行われています。

関連PR

Fessのテーマを名前とバージョンの選択でインストールする

Fessのテーマ管理画面で、テーマ名とバージョンをドロップダウンから選んでインストールする変更がマージされました。自由入力した名前の誤りを、ダウンロード失敗まで気付けない状況を減らす改善です。

インストールの流れ

  1. 管理画面のテーマ管理ページ(/admin/theme/)を開きます。
  2. インストールするテーマ名を選択し、「選択」を押します。
  3. 選んだテーマのバージョン一覧から目的の版を選び、「インストール」を押します。

テーマ名の選択で一度画面が遷移します。続くバージョン一覧は新しい順に並びますが、初期選択は最新の安定版です。たとえば1.1.0-rc1と1.0.0がある場合、初期選択は1.0.0です。安定版が一つもない場合だけ、最新のプレリリースが選ばれます。新しい候補が先頭にあることと、初期選択されることは同じではありません。

インストールされたテーマを実際に使用する際は、利用中のFessやテーマの対応条件を確認し、既存の既定テーマ設定も確認します。今回の変更だけでテーマのインストールと既定テーマの変更が同じ操作になるわけではありません。

候補が表示されない場合

テーマリポジトリーを読み取れない場合や、インストール可能なテーマが公開されていない場合は、候補がない旨とZIPアップロードの案内が表示されます。通信・リポジトリー設定を確認するか、対応するテーマZIPを用意してアップロードしてください。

カタログに存在しないテーマ名を指定しても、バージョン選択には進まず最初の選択画面になります。インストールに失敗した場合もテーマの選択からやり直します。今回の変更は管理画面の入力方法が中心で、管理APIやプラグイン管理画面の操作方法は変更されていません。

関連PR

Fessの検索APIで容量不足と不完全な検索結果を見分ける

検索エンジンの容量不足を「検索式が不正」と扱っていた応答と、検索失敗時の結果を完全な0件に見せていた応答が改善されました。検索APIを利用するアプリケーションでは、HTTPステータスとpartialの両方を確認します。

容量不足は503とRetry-After

OpenSearchがHTTP 429または503で検索を拒否した場合、Fessのv2検索APIはHTTP 503、エラーコード service_unavailable、Retry-After: 5 を返すようになります。5秒は固定値で、新しい設定項目ではありません。

以前は400 invalid_requestとなり、Fessがエスケープした検索式で再試行して、余裕のないエンジンへさらに検索を送っていました。修正後は検索式の問題と切り分け、WARNにエンジンの状態と理由を記録します。呼び出し側はRetry-Afterを尊重し、再試行回数を制限します。

この扱いはエンジンから429/503の応答を受け取る場合です。接続不能などすべての障害が503になるわけではありません。旧v1 APIやWeb画面にも全く同じ応答形式が追加された変更とは扱いません。

200でもpartialを確認する

複数検索器を使うFess側の融合で、主検索器が失敗した場合も partial=true を設定するようになります。検索エンジン停止中に明示的なsortで検索すると、200・0件・partial=falseとなっていた問題を改善します。

record_count_relation=GREATER_THAN_OR_EQUAL_TO は下限を示します。partial=trueやtimed_outを見ずに、200というだけで「該当文書がない」と表示しないようにします。rank.fusion.engine.enabled のFess本体初期値はfalseですが、Dockerデモがtrueを指定する場合もあります。明示sortや高度検索など、エンジン側の融合を使わない条件にも注意します。

不正な num=0 や start=-1 は検索器を実行する前に検証します。これらの400 invalid_requestという応答は従来どおりで、利用者の入力ミスを検索器の障害としてログに積むことを避ける内部改善です。

Dockerのメモリー設定を確認する

docker-filesearchの文書には、parent circuit breakerの容量不足に対する調査手順が追加されました。初期値のヒープは2gのままです。連続検索の高負荷試験では4gで拒否が解消したため、環境のメモリー余力を確認し、必要なら .env に OPENSEARCH_HEAP=4g を設定して docker compose up -d search01 で反映します。

3gでも試験条件によっては拒否が残り、4gでもどんな負荷にも対応できる保証ではありません。OpenSearch再起動後はモデルの再読み込みがあり、最大1分程度キーワード検索だけになることがあります。閾値やクエリーを変える前に、ログ、ヒープ、モデル状態を確認してください。

関連PR