UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Fastly】VCLの正規表現

FastlyのVCL正規表現は何度も調べてしまうのでまとめておく

VCL 正規表現早見表 | Fastly ヘルプガイド

  • req.url == "/phrase" 完全一致
  • req.url ~ "phrase" 部分一致
  • req.http.host ~ "^www" 前方一致
  • req.url ~ "\.jpg$" 後方一致
  • req.url ~ "\.(png|jpg|css|js)$" いずれかに一致
  • req.url ~ "\.html(\?.*)?$" クエリ有無両方の場合に一致(.html, .html?, .html?foo=bar)

マッチした内容を取得する

set req.http.Foo = "abbbccccc";
if (req.http.Foo ~ "^(a+)(b+)(c+)") {
  set resp.http.match0 = re.group.0; # now equals 'abbbccccc'
  set resp.http.match1 = re.group.1; # now equals 'a'
  set resp.http.match2 = re.group.2; # now equals 'bbb'
  set resp.http.match3 = re.group.3; # now equals 'cccccc'
}

regsubを使ってマッチしたものを置換する

STRING regsub(STRING input, STRING pattern, STRING replacement)

if (req.url ~ "(?i)\?.*some_query_arg=([^&]*)") {
  set req.http.Thing-I-Want = regsub(req.url, "(?i)\?.*some_query_arg=([^&]*).*", "\1");
}

regsub | Fastly Developer Hub

re.group.{N}は最後に使われたマッチ演算子のN番目のキャプチャを使用することができる

上の例だと、以下のように書ける

if (req.url ~ "(?i)\?.*some_query_arg=([^&]*)") {
  set req.http.Thing-I-Want = re.group.1;
}

連続する2つの/(スラッシュ)を1つにする

set req.url = regsuball(req.url, "/+", "/");