国判断でのレスポンシブ対応。CDNETWORKS CDNで国判断させて同一URLで別キャッシュ。CDNはVary HTTPヘッダ理解できるのか?!


はじめに

GEOデータベースでリクエストIPから発信元を割り出して、URLは同じなんですが各言語コンテンツを出し分けているレスポンシブっていうんですか?そんなコンテンツ箇所があるんですが、サーバが日本にある為か海外からのアクセスが遅いとのクレームが。。。
そこでCDNを利用して各国最寄りサーバに、それぞれの言語に対応したコンテンツがキャッシュできればと思った次第です。

CDN利用上の壁

ここでCDNがキャッシュを生成していく方法が問題となります。
通常CDNではアクセスされたURL単位でキャッシュを生成しますので、もし日本語のindex.htmlを先に見た人がいれば、それが先にキャッシュされてしまってキャッシュ有効期間切れがやってくるまで、どの国の人が見ても日本語のページのみが見えてしまう事になってしまいます。

こんなことできれば?

そこで考えたのが、Vary HTTPコンセプトの様にサーバーにアクセスがあったときに、データ返却と一緒にVaryヘッダでの指定で、国単位によって内容が変わりますよ!という情報をWEBサーバーがCDNに対して返却して、CDNのキャッシュサーバーが理解できるなら実現ができそう。

*Vary HTTPとはサーバーから返すHTTPヘッダーの1つで「Vary」という名前のもののこと。「今回はこのHTMLを返したけど、この内容はユーザーエージェント名によって変わる場合があります」「この内容はクッキーの状態によって変わることがあります」といった意味を表すシグナル。
GoogleもVary HTTPヘッダーを使用することを強く勧めている。なぜならPC向けのGooglebotがまずWebページにアクセスしてその内容を取得し、インデックスする(つまりグーグルのサーバーにキャッシュを作成する)。そのあとにモバイル向けのGooglebotが同じページをクロールする際に、すでにグーグルのネットワークキャッシュがあるので、そのキャッシュを利用する。すると、モバイル向けGooglebotがPC向けのコンテンツを取得してしまうかもしれないのだ(その反対もあり得る)。だからHTTPヘッダーでVaryを指定しておくのが安心という話らしい。

というわけで。具体的な方法としては:

1.WEBサーバ側でリライトとVary HTTPヘッダ設定を行う
2.リクエスト元のIPから判断してCDN側で国判別ヘッダを差し込む
3.Vary指定したヘッダの値からCDNのキャッシュサーバが個々の内容をキャッシュする!

ちなみ図にするとこんなイメージ

1.WEBサーバ側でリライトとVary HTTPヘッダ設定を行う

CDNで国判断してヘッダを差し込むヘッダ名としては”X-geo”でいこうかとおもいます。
でもってそれに準じてリライトも作成。今回はJPかそれ以外かの2択にしておきたいとおもいます。

↓↓↓で作った.htaccessファイルはこちら↓↓↓

.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/jp/
RewriteCond %{HTTP:X-geo} (JP) [NC]
RewriteRule ^(.*)$ jp/$1 [L]
</IfModule>

<IfModule mod_headers.c>
Header set Vary X-geo
</IfModule>

とりまWEBサーバに放り込んときます。

2.リクエスト元のIPから判断してCDN側で国判別ヘッダを差し込む

CDNETWORKSのポータルからリクエストIPから国判断してヘッダ差込設定を行います。
Products->Contents Acceleration->Configuration->Domain選択->HTTP Protocol Optimizationにいくとヘッダ設定があるので、希望するヘッダ名とアクセスIPから2桁の国コートを差し込んでくれる”%cc"という変数を指定してみます。

こんなかんじ↓

ここで要注意なのが、エッジサーバにVary判断させるにはユーザリクエストが入った時点で付与しておかないといけないのでControl Direction(付与する時点)は”Receive Client Requestに”チェックが入っていることを確認してください。
最初Back to Source Requestだけ、要はWEBサーバに向かうときにだけチェック入れててVary判断してくれなくてハマりました。

3.Vary指定したヘッダの値からCDNのキャッシュサーバが個々の内容をキャッシュする!

最後にキモとなるここですが、ぬぅあんとCDNETWORKS CDNは何もせずにVary HTTPを理解できるそうです!なのでこれは特に設定いらず。

早速確認してみます。
分かりやすいように日本からのアクセスはJPと書かれた画像、VPNで抜けたアメリカからのアクセスにはUSA国旗が出てくるようにしてみました。

まずはフツーに日本からのアクセス↓

の場合↓

ちゃんとJPの画像がでてます。キャッシュしてるか挙動を表すX-PXヘッダも値はht(キャッシュヒット)になっておりちゃんとキャッシュされているようです。

次にVPNでアメリカに抜けてから叩いてみようと思います。

というわけで米国なりましたので叩いてみます↓

さっきと同じURLで今度はUSA国旗になりました!しかもX-PXヘッダはhtということでちゃんとキャッシュもされています。

まとめ

Vary HTTPを利用すると色々とCDNのキャッシュ効果を感じながらもコンテンツの出しわけができそうです。
デフォルトではクライアントレスポンス時にVaryヘッダが落とされる仕様らしいので、この点の変更はサポートにチケットを発行して変えてもらわないといけませんがとりあえず目的は達成できました!