VCL 正規表現早見表

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

基本的な一致

req.url == "/phrase"

req.url/phrase に完全一致する場合のみ一致します。

req.url ~ "phrase"

任意の場所に phrase がある場合に一致します。

文字列の最初または最後の一致

req.http.host ~ "^www"

req.http.hostwww で始まる場合に一致します。

req.url ~ "\.jpg$"

req.url.jpg で終了する場合に一致します。

複数の一致条件

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

req.url.png.jpg.css.js のいずれかで終わる場合に一致します。

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

req.url.php.php?foo=bar.php? のいずれかで終わる場合に一致しますが、.phpa の場合は一致しません。

注意

また、req.url.ext を使って URL で指定されたファイル拡張子を見つけることも可能です。例えば、リクエスト www.example.com/1/hello.gif?foo=bar では、gifreq.url.ext に含まれます。

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

req.url.aserver.bserver.cserver のいずれかで終わる場合に一致します。

ワイルドカード一致

req.url ~ "jp.g$"

req.urljpegjpagjp0g で終わる場合に一致しますが、req.urljpg で終わる場合には一致しません。また、他の文字が jpg の間にある場合にも一致します。

req.url ~ "jp.*g$"

jp に0個以上のランダムな文字が続いて g で終わる場合に一致します (jpegjpgjpeeeeg がすべて一致します)。

一致内容の取得

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;
}

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

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

コンテンツの置き換え

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

ホストの先頭に www. がある場合は、削除します。

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

api-test ヘッダーに host-header を格納しますが、先頭の www.api. に置き換えます。

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
set req.url = regsuball(req.url, "/+", "/");

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


翻訳についての注意事項
このガイドは役に立ちましたか?

このフォームを使用して機密性の高い情報を送信しないでください。サポートが必要な場合は、サポートチームまでご連絡ください。このフォームは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。