HTTPのエンティティヘッダの拡張
pjaxとやらを少し調べていて気になったので。
RFC2616: HTTP 1.1より
4.5 一般ヘッダフィールド 一般ヘッダフィールド名は、プロトコルバージョンの変化に伴う連動においてのみ 確実に拡張されうる。しかしながら、新しい、あるいは実験的なヘッダフィールド は、もしそのコミュニケーションでのすべてのパーティがそれらを一般ヘッダフィー ルドであると認識できるなら、一般的なヘッダフィールドの意味論を与えてもよい。 認識されないヘッダフィールドは、エンティティヘッダフィールドとして扱われる。
7.1 エンティティヘッダフィールド 拡張ヘッダメカニズムは、プロトコルを変更する事無く追加的エンティティヘッダ フィールドを定義できるようにしているが、これらのフィールドが受信者によって 認識されるという事は仮定できない。認識されないヘッダフィールドは、受信者に よって無視されるべきであり、透過的プロクシによって転送されなければならない。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45252&forum=7
pjaxは大まかに言うと、ajaxでブラウザバックとか使えなかったのを使えるようにする技術。githubなんかのアレ。コードの部分のみ書き換えてるけど、アレはajaxでコードのあるURLにアクセスしてコード部分のみ取得してます。このときajax経由じゃなく、そのままコードのあるURLを叩いた場合ももちろんコードのページにアクセスできるわけです。つまり、ajax経由時との違いはコード部分のみを返し、そうでない場合はヘッダー・フッターなどを含むページ全体を、サーバ側が返さなきゃいけないわけなんですが、このリクエストの違いを持たせるのにエンティティヘッダの拡張が使われているわけです。
具体的には以下のようにして「X-PJAX: true」みたいなヘッダーをねじ込むみたい。
$.ajax({ url: '/authors', dataType: 'html', beforeSend: function(xhr){ xhr.setRequestHeader('X-PJAX', 'true') }, success: function(data){ $('#main').html(data) history.pushState(null, $(data).filter('title').text(), '/authors') }) }) //[https://github.com/defunkt/jquery-pjax:title=https://github.com/defunkt/jquery-pjax]