アーカイブ:  « 2010年3月 | メイン | 2010年6月 »

2010年5月31日

Content-Typeヘッダフィールドは必須か?

Webプログラミングをする場合には、必ずと言っていいほど意識しなければならないメディアタイプや文字コードではあるが、Content-Typeヘッダフィールドを制御しない場合には、MIMEタイプをWebサーバーで判断し、text/plainやtext/htmlの場合においてはデフォルト文字コード設定(ApacheでいうところのAddDefaultCharsetディレクティブ)によって出力がされる。

ただ、今日見たWebアプリケーションプログラムは、LocationヘッダフィールドによりリダイレクトしているページにおいてContent-Typeヘッダフィールドの出力なしにボディーにデータが書き込みされていたので、RFCに違反しているのかどうか調べてみた。

対応するRFCは2068(ハイパテキスト転送プロトコル HTTP/1.1)になる。
該当する項目は、7.2.1 型にある

実体本体を含むどんなHTTP/1.1メッセージも,その実体のメディア型を定義するContent-Typeヘッダフィールドを含むことが望ましい。

であり、強制されるものではないようである。したがって、受け手(ブラウザ)はContent-Typeヘッダフィールドがない場合でもメディア型を推定しようとしてよいのである。しかし、こちらも推定しなければならないわけではないので、結果的には正しく通信できない恐れがあるということを示しているようだ。

やはりContent-Typeヘッダフィールドは通信トラブルを避けるためにも「ほぼ」必須のヘッダフィールドであるといえる。

2010年5月30日

携帯サイトをキャッシュする

財テク.jpのモバイルサイトは、CakePHPにKtai Libraryを使って動かしているのだが、Viewキャッシュをしてしまうと、キャリアごとの絵文字に対応できないことと、PCサイトがUTF-8だった場合に、headerでのcharset指定がUTF-8となってしまうため、キャッシュされたページは文字化けしてしまう可能性がある。

前者については絵文字を利用しない方法で対応可能だが、後者についてはキャッシュ済みの場合には、controllerすら通らず、エンコード指定を切り換える対応方法が分からなかったため、しばらくキャッシュさせないようにしていたが、データが多くなってくるとレスポンスが悪くなってきているため、キャッシュの方法を考えてみた。

Viewキャッシュが無理な場合には、modelキャッシュということで、CakePHP1.2 Behaviorでモデルのメソッドキャッシュを行うを使って、modelでキャッシュさせることにした。

結果的には、携帯サイトはmodelキャッシュ、PCサイトはmodelキャッシュ+ビューキャッシュとなりキャッシュによる効果は高くなったように思う。