[Sitecore] サイトコア PDF キャッシュクリア
検証環境は次の通りです。
概要:
お客さんから、エンドユーザーより、一度PDFを開いたら、新しいPDFが更新されてでも、ブラウザのキャッシュクリアしない限り更新されれないといわれました。これはPDFのブラウザのキャッシュクリアをする手順のメモ書きです。
試みその一、max-age
このKBの記事によりますと、既にパブリッシュされたメディアアイテムに新しいコンテンツが添付され、メディアアイテムが再度パブリッシュされると、そのURLを使用してメディアにアクセスすると、直ちにコンテンツ変更がブラウザに反映されないことがあります。これは、MediaResponse.MaxAge設定で指定された時間、メディアがブラウザにキャッシュされているために発生します。ブラウザがメディアアイテムを既に使用している場合、サーバーへのリクエストは実行されず、キャッシュからメディアアイテムを取得できます。 キャッシュされたバージョンの有効期限が切れます。しかし、これはすべてのメディアアイテム応用され、PDFだけに応用することができなかった。
試みその二、ユニークなパラメータ
MediaProviderを変更し、メディアアイテムURLにユニークなパラメータを追加することでザのキャッシュクリアします。この場合はPDFのURLだけにユニークなパラメータを追加することができます。これはいけるぞ思った。しかし、メディアアイテムURLの生成はViewに限らず、下記のところで、その変更に必要以上な変更が必要と分かった。
例えば、このメディアアイテムURLがリッチテキストエディタにて追加された場合は、
<a href="/-/media/test/files/feature-articles/client_feature_next_2018.pdf? la=en" target="_blank" data-ga-category="Download: PDF?LA=EN" data-ga- action="Download" data-ga-label="https://www.test.com/-/media/test/files/feature- articlesclient_feature_next_2018.pdf?la=en">View a PDF of this feature article</a>
また、Coveoを使用したサーチ結果のリストにあるURLがCoveoより生成され、Coveoのモジュールの変更が必要とされてしまします。ですので、これで対応できなかった。
試みその三、メディアハンドラーsitecore_media.ashx
このハンドラはすべての/ – / media / …リクエストをキャッチし、最終的にメディアプロバイダを呼び出しています。つまり、サイトにてすべてのメディアのリクエストを処理するさいに、PDFである際にブラウザのキャッシュクリアをすればいいです。これは既存のメディアURLの変更をする必要がなくなります。一番簡単な変更であった。
さて、コードを見て目ましょう。
1.好きなツールを使って、DLLのコードを開きます。
2.MediaRequestHandlerをソリューションへコピーし、SendMediaHeadersの処理の最後にPDFである場合はブラウザのキャッシュクリアします。
3.web.configにてMediaRequestHandlerを切り替えます。
環境別のTransformationの場合は下記のように設定すればいい。
<add name="Sitecore.MediaRequestHandler" type="Sandbox.Handlers.Resources.Media.MediaRequestHandler, Sandbox.Handlers" xdt:Transform="SetAttributes(type)" xdt:Locator="Match(name)" />