We've been making changes to how we organize and display our docs. Our work isn't done but we'd love your feedback.
Getting started
Basics
Domains & Origins
Performance

Configuration
Basics
Conditions
Dictionaries
Domains & Origins
Request settings
Cache settings
Headers
Responses
Performance
Custom VCL
Image optimization
Video

Security
Access Control Lists
Monitoring and testing
Securing communications
TLS
Web Application Firewall

Integrations
Logging endpoints
Non-Fastly services

Diagnostics
Streaming logs
Debugging techniques
Common errors

Account info
Account management
Billing
User access and control

Reference

    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