入門
基礎
ドメインと起源
性能

構成
ヘッダー
反応
性能
パージ
カスタムVCL
画像の最適化
ビデオ

セキュリティ
Access control lists
モニタリングとテスト
セキュアな通信
TLS
Web アプリケーションファイアウォール (WAF)

診断
ログのストリーム配信
デバッグ手法
一般的なエラー

アカウント情報
課金

    VCL 正規表現早見表

      Last updated August 02, 2018

    Fastly VCL は Perl 互換の正規表現 (Perl Compatible Regular Expression - PCRE) 構文を利用しています。大文字小文字は区別され、スラッシュ(/) はエスケープする必要はありません。正規表現記述の最初に(?i)を含めることで大文字小文字を区別しないように指定することも可能です。

    基本的なマッチ

    1
    
    req.url == "/phrase"
    

    req.url/phrase に完全一致する場合のみマッチ。

    1
    
    req.url ~ "phrase"
    

    phrase を含む場合にマッチ。

    文字列の最初または最後のマッチ

    1
    
    req.http.host ~ "^www"
    

    req.http.hostwww で始まる場合のみマッチ。

    1
    
    req.url ~ "\.jpg$"
    

    req.url.jpg で終了する場合のみマッチ。

    複数のマッチ条件

    1
    
    req.url ~ "\.(png|jpg|css|js)$"
    

    req.url.png.jpg.css.js のいずれかで終了する場合にマッチ。

    1
    
    req.url ~ "\.php(\?.*)?$"
    

    req.url.php.php?foo=bar または .php? で終了する場合にマッチ。.phpa にはマッチしない。

    1
    
    req.url ~ "\.[abc]server$"
    

    req.url.aserver.bserver または .cserver で終了する場合にマッチ。

    ワイルドカードマッチ

    1
    
    req.url ~ "jp.g$"
    

    req.urljpg の間に一文字あり、g で終了する場合にマッチ。 jpegjpag または jp0g はマッチするが、jpg にはマッチしない。

    1
    
    req.url ~ "jp.*g$"
    

    jp の後に0文字以上の文字があり、g で終了する場合にマッチ。(jpegjpg または jpeeeeg はすべてマッチする)

    マッチ内容の取得

    1
    2
    3
    4
    5
    6
    7
    
    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'
    }
    

    re.group.[0-9] オブジェクトを利用すると、マッチした内容を取得することが出来ます。re.group.0 はマッチした全体の文字列を含みます。これらのオブジェクトを使って次のような置換を行うことも出来ます。

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

    同じ処理を re.group を利用して実施する場合は以下のようなコードになります。

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

    次のようなコードでも同じ処理を実施することが可能です。

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

    コンテンツの置き換え

    1
    
    set req.http.host = regsub(req.http.host, "^www\.","");
    

    host に www. が存在する場合は削除(空白に置き換えます)します。

    1
    
    set req.http.api-test = regsub(req.http.host, "^www\.","api.");
    

    hostヘッダーの www.api. に置き換えた値を、 api-test リクエストヘッダーとして設定します。

    1
    2
    3
    4
    5
    6
    
    Host: www.example.com ->
    Host: www.example.com
    api-test: api.example.com
    Host: example.com ->
    Host: example.com
    api-test: example.com
    
    1
    
    set req.url = regsuball(req.url, "/+", "/");
    

    すべての連続するスラッシュをひとつのスラッシュに置き換えます。例えば //docs///intro.html/docs/intro.html に変換されます。

    Back to Top