【PHP】Last-Modifiedヘッダによる静的コンテンツのキャッシュ制御

画像などの静的コンテンツのファイルに直接アクセスした場合は
ブラウザが自動的にキャッシュ制御を行ってくれますが、
PHPで静的コンテンツを返すような処理を行っている場合にキャッシュを利用するには
Last-Modifiedヘッダを使ってキャッシュを制御する必要があります。

まず、PHPでファイルをダウンロードさせる際に
filemtime関数でファイルの更新日時を取得してLast-Modifiedヘッダを追加します。

さらにキャッシュを残すためのヘッダも追加します。

そうすると、次に同じファイルをダウンロードしようとした際のリクエストヘッダの中に

というヘッダが追加され、ファイルの更新日時が入っています。

ですので、このヘッダの有無を調べ、ファイルの更新日時と比較することで
ファイルを返すかキャッシュを返すかを判定します。

レスポンスコード304を返す処理は下記の通りです。

ちなみに、Etagというヘッダを使ってキャッシュを制御することもできますが
Etagはどちらかというと動的コンテンツのキャッシュで利用するためのものです。
静的コンテンツのキャッシュにもEtagを使ったサンプルが多くみられるのですが
Last-Modifiedヘッダだけで十分だと思います。

【Linux】各種バージョンを調べる

調べ方も様々なのでつい忘れてしまいますよね。

CentOSのバージョン

Apacheのバージョン

MySQLのバージョン

PHPのバージョン

【JavaScript】クエリー文字列で同名のパラメータを自動的に配列にしてFormDataにセットする

長いタイトルですが、タイトル通りのことをやることになり、
スマートなやり方が思いつかず、結局ループを2回回す方法でやりました。

【Ajax】通信メソッドが勝手にOPTIONSになったら

以下のような条件でAjax通信を行うと、ブラウザは自動的に「プリフライト」と呼ばれる通信チェックを行います。

プリフライトは通信メソッド「OPTIONS」でサーバーに通信を行い、

をチェックします。
このチェックをパスしなかった場合はそこで処理は終了し、本来のGETやPOSTの通信が行われませんので

「あれ、POSTしたのになんでOPTIONSになってるんだ?」

と混乱してしまいますよね。

ちなみにサーバー側でクロスドメインを許可するには
レスポンスヘッダにAccess-Control-Allow-Originを設定し、許可するドメインを指定します。
PHPの場合ですべてのドメインを許可するなら

のようになります。

また、独自のリクエストヘッダを許可するには
レスポンスヘッダにAccess-Control-Allow-Headersを設定し、許可するヘッダを指定します。

こんな感じです。

【jQuery】イベントが重複登録されるのを防ぐ簡単な方法

まずイベントハンドラの登録は

という感じですが、
JavaScriptによってコンテンツを動的に増やせるようなページを作成しているときに
イベントハンドラの登録がどんどん重複されていくという問題がありました。

解決方法はいくつかありますが、そのとき一番簡単だった解決方法は

onの前にoffを呼ぶ

でした。

これだけですが、期限に追われ余裕がないときは
なかなか気が付かないものですね。