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, "/+", "/");