FastlyのVCLの正規表現は何度も調べてしまうのでまとめておく
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"); }
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, "/+", "/");