vcl_recv
Varnish がクライアントのリクエストを基本的になデータ構造に解析した直後に実行される最初の VCL サブルーチン
用途
キャッシュの多様性をへらすためにクライアントデータを修正
Host ヘッダーの www を削除する、など
使用する Web サーバの選択
クライアントデータに基づいたキャッシュポリシーの決定
特定の Web アプリケーションに必要な書き換えルールの実行
単純なアクセス制御(ACL)
終了処理
pass
キャッシュの lookup を引き継ぐが、Varnish リクエストフローの残りの部分を実行する
pass はバックエンドからのレスポンスをキャッシュに保存しない
pipe
コンテンツを見ずにクライアントのリクエストをバックエンドに転送する全二重のパイプを作成
バックエンドからの応答は、コンテンツをキャッシュせずにクライントに転送される
hash
リクエストをキャッシュで検索
purge
キャッシュ内のリクエストを削除するために検索
synth
Varnish から合成応答を生成
クライアントのリクエストをリダイレクトするためにも使用される
sample
code:vcl
sub vcl_recv {
if (req.method == "PRI") {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
} if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" &&
req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (hash);
}
基本的なデバイス検出
User-Agent をもとにカスタムヘッダーを作る
code:vcl
sub vcl_recv {
if (req.http.User-Agent ~ "iPad" ||
req.http.User-Agent ~ "iPhone" ||
req.http.User-Agent ~ "Android") {
set req.http.X-Device = "mobile";
} else {
set req.http.X-Device = "desktop"
}
}
リライト URL とホストヘッダーフィールド
code:vcl
sub vcl_recv {
set req.http.x-host = req.http.host;
set req.http.x-url = req.url;
/* www つきとなしでキャッシュが同じものになるように設定 */
set req.http.host = regsub(req.http.host, "^www\.", "");
/* 特定ドメイン */
if (req.http.host == "sport.example.com") {
set req.http.host = "example.com";
set req.url = "/sport" + req.url;
}
if (req.http.host ~ "^sport\.") {
set req.http.host = regsub(req.http.host, "^sport\.", "");
set req.url = regsub(req.url, "^", "/sport")
}
}