プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Traffic Director構成ファイル・リファレンス
12c (12.2.1.3.0)
E90198-02
目次へ移動
目次

前
次

A 変数、式、ワイルドカードおよび文字列補間の使用

このフィールドに指定する正規表現により、サーバーでクライアント・リクエストを処理するための様々な条件を定義します。これらの正規表現では、Oracle Traffic Director構成のobj.confファイル内にIf条件が定義され、ディレクティブのセットをどのように処理するかが決定されます。

たとえば、ルート設定route_1内に条件$uri = "/images/*"を指定すると、構成のobj.confファイル内に次のIfタグが定義されます。

<If $uri = "/images/*">
NameTrans fn="assign-name" id="route_1" name="route_1"
</If>

この付録の内容は次のとおりです。

関連項目

If、ElseIfおよびElseタグ

IfElseIfおよびElseタグでは、ディレクティブのセットを実行する条件を定義できます。これらのタグは、Objectタグの内部でのみ使用できます。また、これらのタグで式を評価して、含まれている1つ以上のディレクティブを条件付きで実行できます。次に、これらのタグの使用方法をまとめます。

  • IfタグとElseIfタグでは、正規表現のサポートなど、より複雑な式構文を作成できます。IfおよびElseIfの式構文の詳細は、「式」を参照してください。

  • IfElseIfおよびElseタグには、他のタグを含めることができます。

  • IfおよびElseIfの式は、含まれているディレクティブごとにではなく、リクエストごとに1回評価されます。

  • IfElseIfおよびElseタグに、複数のタイプのディレクティブを含めることはできません。

  • IfタグとElseIfタグ内のディレクティブには、正規表現の後方参照を含めることができます。

使用する場合、ElseIfタグまたはElseタグは、IfタグまたはElseIfタグの直後に続ける必要があります。ElseIfタグとElseタグは、先行するIfまたはElseIfの式が論理真に評価されるとスキップされます。

次の例は、IfElseIfおよびElseタグの構文を示しています。

<If $path eq "/">
<If $browser =~ "MSIE">
NameTrans fn="rewrite" path="/msie.html"
</If>
<ElseIf $browser =~ "Mozilla">
NameTrans fn="rewrite" path="/mozilla.html"
</ElseIf>
<Else>
NameTrans fn="rewrite" path="/unknown.html"
</Else>
</If>

この例では、ブラウザがMicrosoft Internet Explorer、Mozilla Firefoxまたは他のブラウザのいずれであるかに応じて異なるページを表示します。

変数

Oracle® Fusion Middlewareでは、サーバーによって事前に定義されている変数のセットを使用できる他、独自にカスタム変数を定義することもできます。この項には次のトピックが含まれます:

事前定義変数

事前定義変数は、サーバーによって暗黙的に定義されています。次の表には、事前定義変数およびその説明がリストされています:

変数 説明

$n

正規表現の後方参照(n番目の取得サブパターンの値、n = 1...9)、たとえば$1

正規表現の後方参照は、IfコンテナおよびElseIfコンテナの本文内において、コンテナ式に1つ以上の正規表現が含まれている場合にのみ使用できます。

$&

正規表現に一致した値。

正規表現の後方参照は、IfコンテナおよびElseIfコンテナの本文内において、コンテナ式に1つ以上の正規表現が含まれている場合にのみ使用できます。

$n

正規表現の後方参照(n番目の取得サブパターンの値、n = 1...9)、たとえば$1

正規表現の後方参照は、IfコンテナおよびElseIfコンテナの本文内において、コンテナ式に1つ以上の正規表現が含まれている場合にのみ使用できます。

$&

正規表現に一致した値。

正規表現の後方参照は、IfコンテナおよびElseIfコンテナの本文内において、コンテナ式に1つ以上の正規表現が含まれている場合にのみ使用できます。

$body

OTDがクライアント(ブラウザ)から受け取る現行のHTTPリクエストのエンティティボディ(ある場合)が含まれます。この変数に格納されるデータのサイズは、server.xmlのhttp要素のbody-buffer-sizeサブ要素を使用して構成されます。

$browser

Webブラウザ・バージョン(クライアントがUser-Agentヘッダーまたは空の文字列を送信した場合の$headers{'user-agent'}のエイリアス)。

$chunked

チャンク・エンコーディングを使用してリクエスト本文が送信されたかどうかを示すブール変数。

$code

レスポンス・ステータス・コード。

$cookie{'name'}

リクエストのCookie nameの値。

$dns

$client{'dns'}のエイリアス。

$env{'name'}

環境変数nameの値(CGI/SHTMLの環境変数を含む)。

$headers{'name'}

rq->headersnameの値、つまりリクエスト・ヘッダー名の値(nameは小文字の文字列)。

$id

server.xmlファイル内のvirtual-server要素のnameサブ要素によって指定される仮想サーバーID。

$internal

リクエストが内部で生成されたかどうかを示すブール値。

$ip

$client{'ip'}のエイリアス。

$keep_alive

接続が開いたままであるかどうかを示すブール値。

$keysize

$client{'keysize'}のエイリアス。

$method

リクエスト・メソッド($reqpb{'method'}のエイリアス)。

$path

リクエストされたパス(ステージに応じてURI、部分パス、ファイル・システム・パスのいずれか)。

事前定義変数pathrq->varspathの値です。rq->varspathが設定されていない場合(たとえば、NameTransが完了していない場合)、pathrq->varsppathの値を取得します。

$path_info

$vars{'path-info'}のエイリアス。

$ppath

$vars{'ppath'}のエイリアス。

$protocol

リクエスト・プロトコル($reqpb{'protocol'}のエイリアス)。

$query

リクエスト問合せ文字列($reqpb{'query'}のエイリアス)。

$reason

レスポンス理由フレーズ。

$referer

$headers{'referer'}のエイリアス。

$reqpb{'name'}

rq->reqpbnameの値。

$restarted

リクエストが再起動されたかどうかを示すブール値。

$secret_keysize

$client{'secret-keysize'}のエイリアス。

$server_url

自己参照URLの接頭辞。

$time

2006年1月1日00:00:00 UTCを基準として秒数で表したリクエスト受信時間。

$time_day

リクエストを受信した日。値の範囲は01から31です。

$time_hour

深夜を基準として表したリクエスト受信時間。値の範囲は00から23です。

$time_min

リクエストを受信した分。値の範囲は00から59です。

$time_mon

リクエストを受信した月。値の範囲は01から12です。

$time_sec

リクエストを受信した秒。値の範囲は00から61です。

$time_wday

リクエストを受信した曜日。値の範囲は0から6であり、0は日曜日に対応します。

$time_year

リクエストを受信した年(4桁)。

$type

$srvhdrs{'content-type'}のエイリアス。

$uri

リクエストされたリソースのURI($reqpb{'uri'}のエイリアス)。

$url

リクエストされたリソースのURL。

$urlhost

クライアントが接続したホスト名。

$vars{'name'}

rq->varsnameの値。

$security

セキュア・トランスポートが使用されたかどうかを示すブール値。

$senthdrs

レスポンス・ヘッダーが送信されたかどうかを示すブール値。

$srvhdrs{'name'}

rq->srvhdrsnameの値、つまりレスポンス・ヘッダー名の値(nameは小文字の文字列)。

カスタム変数

server.xmlファイルでは、variables要素を使用してカスタム変数を定義できます。その後、obj.confの関数の関数パラメータでこれらの変数を使用できます。リクエスト時にobj.confファイル内でset-variables関数を使用して変数を定義することもできます。

注意:

事前定義変数はカスタム変数よりも優先されます。カスタム変数には大文字の名前を使用することをお薦めします。大文字を使用することで、将来、事前定義変数のリストが拡張されても小文字の事前定義変数との競合を回避できます。

変数の解決

サーバーでは、$variableを解決するときに次の順序が使用されます:

  1. 事前定義変数

  2. obj.conf内でset-variableを使用してリクエスト時に定義された変数

  3. server.xml内でvirtual-server要素のvariableサブ要素によって定義された変数

  4. server.xml内でserver要素のvariableサブ要素によって定義された変数

$variableをリクエスト時に定義すると、その内容がrq->vars pblockに名前-値ペアとして格納されます。これらの変数にはserver.xmlの変数よりも高い優先度が割り当てられるため、server.xmlの変数はリクエスト時にオーバーライドされます。

式を使用すると、サーバー・アプリケーション関数(SAF)のパラメータを動的に作成してどのSAFを実行するかをリクエストごとに選択できます。式はリテラル、変数、関数および演算子から作成されます。式はIfタグおよびElseIfタグ、ログ形式文字列およびSAFのパラメータで使用します。

この項で説明する項目は、次のとおりです。

式構文

式構文はPerlで使用される構文と似ています。式はリテラル、変数、関数および演算子から作成されます。

次に、Ifタグ内での式の使用例を示します:

<If not $internal
    and $uri =~ "^/private/(.*)$" 
    and $referer !~ "^https?://example.com/"> 
NameTrans fn="redirect" 
          url="http://example.com/denied.jsp?file=$1" 
</If> 

この例では、式により、リクエストが特定の基準を満たしているかどうか、たとえば、内部リクエストであるかどうかをチェックします。リクエストが基準を満たさない場合、サーバーはリクエストをリクエスト拒否用のURLにリダイレクトします。

式には、次のコンポーネントが含まれています:

  • リテラル - "^/private/(.*)$"および"^https?://example.com/"

  • 変数 - $internal$uriおよび$referer

  • 演算子 - notand=~および!~

IfタグとElseIfタグの詳細は、「If、ElseIfおよびElseタグ」を参照してください。

ブール値としての式の結果

特定の状況において、たとえば、If式またはElseIf式を評価した後、サーバーで式の結果をブール値として処理する必要があります。数値をブール値に変換するとき、サーバーでは次のルールが使用されます:

  • ゼロはfalseに評価されます。

  • それ以外のすべての数値はtrueに評価されます。

文字列をブール値に変換するとき、サーバーでは次のルールが使用されます:

  • 長さがゼロの文字列はfalseに評価されます。

  • 文字列0(ゼロ)はfalseに評価されます。

  • それ以外のすべての文字列はtrueに評価されます。

式リテラル

式リテラルは文字列リテラルと数値リテラルに分けられます。

文字列リテラル

文字列リテラルは一重引用符(')または二重引用符(")で囲みます。文字列リテラルを一重引用符で囲んだ場合、リテラルの値は引用符内の値です。二重引用符を使用した場合、引用符内にある変数または式への参照がすべて補間されます。詳細は、文字列補間を参照してください。

次の式は、一重引用符および二重引用符の使用例です。

# This expression evaluates to true.
('foo' eq "foo")

# This expression evaluates to false.
('foo' eq "bar")

# This expression evaluates to true.
('foo' eq "f$(lc('O'))o")

# This expression may evaluate to true or false,
# depending on the value of the variable $foo
('$foo' eq "$foo")

二重引用符で囲んだ文字列内に補間されないドル記号$を含めるには、2つのドル記号($$)または円記号とドル記号(\$)のエスケープ・シーケンスを使用します。

二重引用符で囲んだリテラル内に二重引用符を表示する場合は、その前に円記号を付ける必要があります。二重引用符で囲んだリテラル内に円記号(\)を表示する場合は、その前に円記号を付ける必要があります。一重引用符で囲んだリテラル内に一重引用符を表示する場合は、その前に円記号を付ける必要があります。

次に、有効なリテラルおよび無効なリテラルの例を示します:

# The following are examples of valid literals
'this string literal is bracketed by single quotes'
"this string literal is bracketed by double quotes"
"the backslash, \\, escapes characters in double quote string literals"
'it\'s easy to use strings literals'

# The following are examples of invalid literals
'it's important to escape quote characters'
"any \ characters in double quote string literals must be escaped"

数値リテラル

数値リテラルには、10進数とオプションの小数点、先頭のゼロとそれに続く8進数、または先頭の0x接頭辞とそれに続く16進数を使用できます。16進数および8進数は、10進数の形式に自動的に変換されます。

次に、数値リテラルを使用する式の例を示します:

# The following expressions evaluate to true
(1 < 2)
(0x10 == "16")
(1 == 1.00)

# The following expressions evaluate to false
(1 > 2)
("0x10" == 16)
(1 != 1.00)

式変数

式では、任意の$variableを変数として使用できます。Clientタグの構文に合わせるため、式では事前定義変数名のドル記号$接頭辞を省略できます。たとえば、obj.confファイルに記述された次の3つの部分は意味的に同等です:

<If $uri = "*.html">
...
</If>

<If uri = "*.html">
...
</If>

<Client uri = "*.html">
...
</Client>

独自に定義した変数名には、$接頭辞を使用する必要があります。たとえば、server.xmlvariable要素内にsomecustomvariableが定義されていても、次の式は無効です:

<If somecustomvariable = "foo">
...
</If>

この式を有効にするには、ドル記号接頭辞を追加します:

<If $somecustomvariable = "foo">
...
</If>

式演算子

次の表には、式で使用される演算子がリストされています。

演算子記号 演算子名

!

C言語形式の論理否定

=

ワイルドカード・パターン一致

=~

正規表現一致

!~

正規表現不一致

+

加算または単項のプラス

-

減算または単項のマイナス

.

文字列連結

defined

値が定義済

-d

ディレクトリが存在

-e

ファイルまたはディレクトリが存在

-f

ファイルが存在

-l

シンボリック・リンクが存在

-r

ファイルが読取り可能

-s

ファイル・サイズ

-U

URIがアクセス可能なファイルまたはディレクトリにマップ

<

より小さい(数値)

<=

以下(数値)

>

より大きい(数値)

>=

以上(数値)

lt

より小さい(文字列)

le

以下(文字列)

gt

より大きい(文字列)

ge

以上(文字列)

==

等しい(数値)

!=

等しくない(数値)

eq

等しい(文字列)

ne

等しくない(文字列)

^

C言語形式の排他的論理和

&&

C言語形式の論理積

||

C言語形式の論理和

not

論理否定

and

論理積

or

論理和

xor

排他的論理和

次の表には、式で使用できる演算子の優先順位が、優先順位の高いものから順にリストされています。

記号 オペランド 結合性 説明

( ), [ ]

0

左から右

カッコ

!、単項の+、単項の-

1

右から左

符号演算子

=, =~, !~

2

非結合的

パターン一致演算子

+, -, .

2

非結合的

加法演算子

defined-d-f-l-r-s-U

1

右から左

名前付き演算子

<lt<=le>gt>=ge

2

非結合的

関係演算子

==eq!=ne

2

非結合的

等値演算子

^

2

左から右

C言語形式の排他的論理和演算子

&&

2

左から右

C言語形式の論理積演算子

||

2

左から右

C言語形式の論理和演算子

not

1

右から左

論理否定演算子

and

2

左から右

論理積演算子

orxor

2

左から右

論理和演算子

数値演算子(<<=>>===!=)は、文字列ではなく数値を対象として動作します。数値、日付およびタイムスタンプの比較を容易にするため、数値演算子では引数に含まれている空白、コロン、スラッシュおよびカンマがすべて無視されます。最初の桁より後のダッシュも無視されます。

注意:

通常、数値以外に数値演算子を使用することは正しくありません。

たとえば、次の式はtrueに評価されます:

# The following expression evaluates to true because both
# "foo" and "bar" are numerically equivalent to 0
("foo" == "bar")

式関数

式関数により、式で使用するデータを操作します。式関数はSAFとは異なります。SAFはHTTPリクエストに関連付けられた実際の作業を実行するのに対し、式関数は、どのSAFを実行するかおよび何のパラメータをSAFに渡すかを選択するために使用されます。

一部の式関数には、1つ以上の引数が必要です。式関数では、引数リストをカッコ(())で囲み、個々の引数をカンマ(,)で区切ります。

次の項には、個々の式関数がリストされています:

atime

atime関数は、指定されたファイルまたはディレクトリの最終アクセス時間を返します。

構文

atime (path)

引数

次の表で、この式関数の引数について説明します。

引数 説明

path

最終アクセスをリクエストするディレクトリまたはファイル名への絶対パス

choose

choose関数は、valuesのパイプで区切られた値を解析して、その1つをランダムに返します。

構文

choose (values)

引数

次の表で、この式関数の引数について説明します。

引数 説明

values

選択元となる、パイプ文字(|)で区切られた値のリスト

次のobj.confコードでは、chooseを使用して3つのイメージの中から1つをランダムに選択します:

NameTrans fn="rewrite"
          from="/images/random"
          path="/images/$(choose('iwsvi.jpg|0061.jpg|webservervii.jpg'))"

ctime

ctime関数は、指定されたファイルまたはディレクトリの最終ステータス変更時刻を返します。

構文

ctime (path)

引数

次の表で、この式関数の引数について説明します。

引数 説明

path

最終ステータス変更をリクエストするディレクトリまたはファイル名への絶対パス

escape

escape関数は、util_uri_escapeを使用して特殊なオクテットをパーセント・エンコードされた同等値に変換することによってURIをエンコードし、その結果を返します。

構文

escape(uri)

引数

次の表で、この式関数の引数について説明します。

引数 説明

uri

式関数によって変換されるURI

注意:

unescape

external

external関数は、外部のリライト・プログラムに値を渡し、その結果を返します。

externalを起動するたびに改行が1回発生しますが、これは終端された行が外部のリライト・プログラムのstdinに書き込まれるためです。このプログラムでは、入力行ごとに出力行を1行生成する必要があります。外部のリライト・プログラムを開発するときは、stdoutのバッファリングを回避することが重要です。たとえば、Perlでは$| = 1;と記述するとバッファリングが無効になります。サーバーでは外部のリライト・プログラムが入力行ごとに出力行を1行生成することを想定しているため、外部のリライト・プログラムがその出力をバッファリングしている場合、サーバーが応答しなくなる可能性があります。

構文

external (program, value)

引数

次の表に、external関数の引数を示します。

引数 説明

program

program引数は、外部のリライト・プログラムのファイル名です。プログラムはオペレーティング・システムのデフォルト・シェル(UNIX/Linuxの/bin/sh)またはコマンド・インタプリタ(WindowsのCMD.EXE)を使用して実行されるため、programには絶対パス、またはオペレーティング・システムのPATHにあるプログラムの名前を指定する必要があります。サーバーは要求に応じて外部のリライト・プログラムを起動します。サーバー・プロセスによってプログラムのインスタンスが一度に複数実行されることはありません。

value

リライト・プログラムに渡される値。

次の例は、接頭辞/home/を/u/に変更するために使用する、外部のリライト・プログラムrewrite.plです:

#!/usr/bin/perl
$| = 1;
while (<STDIN>) {
	     s|^/home/|/u/|;
     print $_;
}

この例において、rewrite.plを起動するために使用するexternal式関数は、次のとおりです:

NameTrans fn="rewrite" path="$(external('rewrite.pl', $path))"

httpdate

httpdate関数は、ExpiresなどのHTTPヘッダー・フィールドで使用する、RFC 1123の日付タイムスタンプを返します。

構文

httpdate (time)

引数

次の表で、httpdate関数の引数について説明します。

引数 説明

time

時間の値。

次のobj.confコードは、レスポンスが1日より長い期間キャッシュされていないことを示すExpiresヘッダーを設定するために使用できます:

ObjectType fn="set-variable"
           insert-srvhdrs="$(httpdate($time + 86400))"

lc

lc関数は、文字列内にあるすべてのUS ASCII文字を小文字に変換し、その結果を返します。

構文

lc(string)

引数

次の表で、lc関数の引数について説明します。

引数 説明

string

式関数によって小文字に変換される文字列

次のobj.confコードは、リクエストURIに間違って大文字を使用したクライアントを同等の小文字URIにリダイレクトするために使用できます:

<If code == 404 and not -e path and -e lc(path)>
Error fn="redirect" uri="$(lc($uri))"
</If>e($time + 86400))"

注意:

uc

length

length関数は、その引数の長さ、つまり、文字列の長さを表す数値を返します。

構文

length (string)

引数

次の表で、この式関数の引数について説明します。

引数 説明

string

式関数によって長さが計算される文字列

次のobj.confコードは、255バイトよりも長いURIをリクエストしたクライアントに404 Not Foundエラーを送信するために使用できます:

<If length($uri) > 255)>
PathCheck fn="deny-existence"
</If>

lookup

lookup関数は、テキスト・ファイル内にある名前-値ペアを調べ、名前nameに対応する値を返します。ファイル内の名前-値ペアは、空白で区切られます。

指定された名前の名前-値ペアがファイル内に含まれていない場合、この関数はdefaultvalueの値(指定されている場合)を返すか、空の文字列を返します。

構文

lookup(filename, name, defaultvalue)

引数

次の表で、この式関数の引数について説明します。

引数 説明

filename

行ごとに1つの名前-値ペアを含むテキスト・ファイルの名前を示します。filenameには、絶対パス、またはサーバーのconfigディレクトリへの相対パスを指定できます。名前と値は、空白で区切られます。ポンド記号(#)で始まる行は無視されます。

name

この関数によってテキスト・ファイル内を検索する対象となる、名前-値ペアの名前。

defaultvalue

filenameが存在するものの、その中に名前がnameの値に一致する名前-値ペアが含まれていない場合に、この関数が返す値。defaultvalueが指定されていない場合、このデフォルト値は空の文字列になります。

次の例は、ショートカットURIをURIにマップするlookup関数とともに使用できる、urimap.confというテキスト・ファイルを示しています:

# This file contains URI mappings for Oracle Traffic Director.
# Lines beginning with # are treated as comments.
# All other lines consist of a shortcut URI, whitespace, and canonical URI.
/webserver /software/products/web_srvr/home_web_srvr.html
/solaris   /software/solaris/
/java      /software/java/

前述のサンプル・テキスト・ファイルを使用して、よくアクセスするリソースのショートカットURIを実装するには、次のlookup式を使用します:

<If lookup('urimap.conf', uri)>
NameTrans fn="redirect" url="$(lookup('urimap.conf', uri))"
</If>

lookupregex

lookupregex関数は、テキスト・ファイル内にある正規表現-値ペアを調べます。この関数は、入力として文字列を使用し、それを各行の正規表現と照合します。これは、一致した場合にのみ対応する値を返します。ファイルに一致が含まれていない場合、この関数はデフォルト値(指定されている場合)を返すか、空の文字列を返します。

構文

lookupregex (filename,string,defaultvalue)

引数

次の表で、この式関数の引数について説明します。

引数 説明

filename

filenameは、1行ごとに1つの正規表現-値ペアを含むテキスト・ファイルの名前です。filenameには、絶対パスまたはサーバーの構成ディレクトリを基準とする相対パスを指定できます。

string

テキスト・ファイルのすべての正規表現と照合する文字列。

defaultvalue

filenameが存在するものの、一致する正規表現-値ペアが含まれていない場合に、この関数が返す値。defaultvalueが指定されていない場合、このデフォルト値は空の文字列になります。

mtime

mtime関数は、指定されたファイルまたはディレクトリの最終データ変更時刻を返します。

構文

mtime(path)

引数

次の表で、この式関数の引数について説明します。

引数 説明

path

最終データ変更をリクエストするディレクトリまたはファイル名への絶対パス

owner

owner関数は、ファイルの所有者を返します。

構文

owner(path)

引数

次の表で、この式関数の引数について説明します。

引数 説明

path

最終データ変更をリクエストするディレクトリまたはファイル名への絶対パス

uc

uc関数は、文字列内にあるすべてのUS ASCII文字を大文字に変換し、その結果を返します。

構文

uc(string)

引数

次の表で、この式関数の引数について説明します。

表A-1 ucの引数

引数 説明

string

式関数によって大文字に変換される文字列

注意:

lc

unescape

unescape関数は、util_uri_unescapeを使用してパーセント・エンコードされたオクテットをそのエンコード前の形式に変換することによってURIをデコードし、その結果を返します。

構文

unescape(uri)

引数

次の表で、この式関数の引数について説明します。

表A-2 unescapeの引数

引数 説明

uri

関数によって変換されるURI。

注意:

escape

uuid

uuid関数は、UUIDを文字列として返します。uuidを呼び出すと、毎回異なるUUIDが返されます。値が一意であることが保証されているため、UUIDはクライアント固有のCookie値を作成するときに役立ちます。

構文

uuid()

正規表現

If式およびElseIf式では、正規表現マッチング演算子の等号とチルダ(=~)および感嘆符とチルダ(!~)を使用して正規表現を評価できます。これらの正規表現では、Perl Compatible Regular Expressions (PCRE)によって実装されたPerl互換構文を使用します。

デフォルトでは、正規表現の大文字と小文字は区別されます。次の例のように正規表現の先頭に(?i)オプション・フラグを追加すると、大文字と小文字を区別しないようにリクエストできます:

$uri =~ '^/[Ff][Ii][Ll][Ee][Nn][Aa][Mm][Ee]$'

$uri =~ '(?i)^/filename$'

If式またはElseIf式に正規表現が含まれている場合、コンテナ本文の引数内でその正規表現の後方参照を使用できます。正規表現の後方参照は$nの形式で表され、nは、次の例のような正規表現の取得サブパターンに対応する1から9の整数になります:

<If $path =~ '^(.*)(\.html|\.htm)$'>
NameTrans fn="rewrite" path="$1.shtml"
</If>

表示されている例では、If式内に2つのサブパターンが使用されているため、$1および$2を後方参照として使用できます。この例では、最初の取得サブパターンの値がNameTrans fn="rewrite"のパラメータ内で使用されています。2番目の取得サブパターンの値は無視されます。

If式またはElseIf式には、次の例のように、その同じIf式またはElseIf式にある前の正規表現への後方参照を含めることができます。

<If "foo" =~ "(.*)" and $1 eq "foo">
# Any contained directives will be executed
# since $1 will evaluate to "foo"
...
</If>

表示されているIf式は常にtrueに評価されるため、If式の内容は実行されます。

ただし、If式、Elseif式およびそれらに含まれているディレクティブに、親コンテナ内の正規表現への後方参照を含めることはできません。たとえば、次のobj.confエントリは無効です:

<If $path =~ '(.*)\.css'>
<If $browser = "*MSIE*">
# This example is invalid as $1 is not defined
AuthTrans fn="rewrite" path="$1-msie.css"
</If>
</If>

ドル記号およびアンパサンド$&を使用すると、最後に正規表現に一致した値を取得できます。次のobj.confエントリを使用すると、HTMLファイルに対するリクエストを別のサーバーにリダイレクトできます:

<If $path =~ '\.html$' or $path =~ '\.htm$' >
NameTrans fn="redirect" url="http://docs.example.com$&"
</If>

文字列補間

変数または式への参照を含む文字列は、補間文字列と呼ばれます。補間文字列を使用した場合、埋め込まれた式および変数が評価され、その結果が文字列に挿入されます。データを文字列に挿入する操作は、文字列補間と呼ばれます。

補間文字列は、式、ログ形式およびobj.confのパラメータ内で使用します。式では、二重引用符で囲まれた文字列リテラルのみが補間されます。「式リテラル」を参照してください。

補間文字列での変数の使用

文字列に変数の値を含めるには、変数の名前の前にドル記号($)を付けます。たとえば、server.xml内にある次のformat要素では、HTTPリクエストごとにクライアントのIPアドレス、リクエストされたURIおよび対応するファイル・システム・パスがロギングされます:

<access-log>
  <file>access</file>
  <format>$ip "$uri" $path</format>
</access-log>

この例において、$ip$uriおよび$pathは事前定義変数です。「変数」を参照してください。

アクセス・ログおよびログ形式の詳細は、カスタム・アクセス・ログ・ファイル形式の使用を参照してください。

変数の名前があいまいになる場合は、名前に中カッコ{}を追加します。たとえば、次の文字列には事前定義の$path変数への参照が含まれています:

"${path}html"

中カッコがない場合、文字列にはpathhtmlという仮想的な変数への参照が含まれます。

補間文字列での式の使用

文字列に式の結果を含めるには、式の前にドル記号および左カッコ$(を付け、式の後に右カッコ)を付けます。たとえば、次の2つの文字列は補間後に同一になります:

"$(2 + 2)"

"4"

補間文字列をobj.confのパラメータとして使用した場合、対応する命令が実行されるたびに文字列が補間されます。たとえば、obj.confファイル内で次の行を使用すると、リクエストされたURIおよびファイルredirect.confの内容に基づいてクライアントをリダイレクトできます:

<Object ppath="/redirect/*">
NameTrans fn="redirect" url="$(lookup('redirect.conf', $uri, '/'))"
</Object>

この例では、NameTransディレクティブが起動されるたびに式lookup('redirect.conf', $uri, '/')が評価され、その結果がredirect SAFにそのurlパラメータで渡されます。

ワイルドカード・パターン

Oracle Traffic Directorでは、式でのワイルドカード・パターン一致がサポートされています。ワイルドカード文字を特別な意味を持たせずにそのまま使用するには、その文字の前に円記号(\)を付けます。

次の表で、様々なワイルドカード・パターンおよびそれらの用途について説明します。

ワイルドカード 用途

*

0文字以上の文字に一致します。

?

任意の1文字に一致します。

|

or式です。この演算子とともに使用するサブストリングには、アスタリスク*、ドル記号$など、他の特殊文字を含めることができます。サブストリングは、たとえば(a|b|c)のようにカッコで囲む必要がありますが、カッコをネストすることはできません。

$

文字列の終わりに一致します。これはor式で役立ちます。

[abc]

abまたはcの1文字に一致します。これらの式内では、特殊文字として扱う必要がある文字は右大カッコ]のみであり、他のすべての文字は特殊文字には該当しません。

[a-z]

aからzの間の1文字に一致します。

[^az]

aおよびzを除く、任意の1文字に一致します。

*~

この式の後に別の式を指定することで、2番目の式に一致するすべてのパターンが除外されます。

次の表に、ワイルドカード・パターンの例およびその結果を示します。

ワイルドカード 結果

*.example.com

文字列.example.comで終わる任意の文字列に一致します。

(quark|energy).example.com

quark.example.comまたはenergy.example.comに一致します。

198.93.9[23].???

198.93.92または198.93.93で始まり任意の3文字で終わる数値文字列に一致します。

*.*

ピリオドが含まれる任意の文字列に一致します。

*~example-*

example-で始まる文字列を除く、任意の文字列に一致します。

*.example.com~quark.example.com

1つのホストquark.example.comを除く、ドメインexample.comの任意のホストに一致します。

*.example.com~(quark|energy|neutrino).example.com

ホストquark.example.comenergy.example.comおよびneutrino.example.comを除く、ドメイン.example.comの任意のホストに一致します。

*.com~*.example.com

サブドメインexample.comのホストを除く、ドメイン.comの任意のホストに一致します。

*~*.gif*

gifを含む文字列を除く、任意の文字列に一致します。