カレンダーアプリが、もう存在しない .ics ファイルに延々とアクセスし続ける。サーバ側でなんとかしたい。

さて、カレンダーアプリは通常、サーバ上のカレンダーファイル(.ics)を登録・照会すると、一定の間隔でそのファイルにアクセスして更新状況を確認し、適宜情報のアップデートを行います。

サーバのアクセスログを見てみると、

  • ★カレンダーアプリが、参照している .ics ファイルにアクセスしたときに、そのファイルが:
    1. 更新されていれば、サーバはステータスコード 200 (OK) を返して更新されたファイル内容を送信。
    2. 変更がなければコード 304 (Not Modified) を返してファイル内容は送信しない。
    3. 削除されていれば「ファイルが無いよ」ということを知らせるためにコード 404 (Not Found) を返す。

…と、まぁ当然の挙動をしているのですが。

で、問題は上記の3番。

サーバ上で、例えば超古い .ics ファイルを削除したとします。超古いにもかかわらず、手許のカレンダーアプリで照会し続けているユーザーさんは存在するはずです、たぶん。

既に存在しない .ics を参照している場合、さて、どうなるか。

確認した限りでは、多くのカレンダーアプリで、照会している .ics ファイルが Not Found であっても、ファイルの存在有無を確かめるために定期的に延々とサーバにアクセスし続けるようなのですね。

なんだかとても無駄なトラフィック。

そこで「もうファイルは無いのですよ。諦めて、アクセスを止めてください」と伝えるにはどうすればよいか。いろいろ試した中では以下がベスト。

アクセスに対して、404 Not Found ではなく、410 Gone を返す。

具体的には、削除された .ics ファイル(仮に test.ics という名前だとします)が存在したディレクトリの .htaccess に、以下を記述。

こう設定しておけば、test.ics へのアクセスに対して「410 Gone」が返されます。カレンダーアプリ側で、照会しているファイルが「410 Gone(もはや存在しない)」であることが判れば、定期的な参照を即座にストップしてくれるアプリケーションもあります。

例えば Thunderbird は、「410 Gone」というレスポンスが返ってきたら、即座にそのカレンダーは無効化されます。

thunderbird_calendar.png

無効化されているカレンダーは「有効化」ボタンをクリックしない限り、サーバへの問い合わせは行いません。

一方、iOS のカレンダーアプリは、【設定】→【カレンダー】→【アカウント】→【照会したカレンダー】で確認してみると…

ios_calendar.png

サーバから「410 Gone」が返されたカレンダーに対しては、一応「停止中」と表示されます。が、サーバのログを確認してみると、「停止中」となった後も、相変わらずサーバへのアクセスは続いています。アクセス頻度は落ちている気がしなくもないけれど。

う〜ん。

というわけで、iOSのカレンダーアプリに対しては、サーバ側で講じられる手立てはこれ以上もう無さそう。利用者側が『照会したカレンダー』のリストを見て「あ、このカレンダー、停止中になっている。削除しよ」とか思ってくれないと、たぶんアクセスは止まらない。

カテゴリ: