この章では、動的フラグメントを使用したコンテンツ・アセンブリに提供されているEdge Side Include(ESI)タグについて説明します。
ESIはオラクル社が共同開発に参加したオープン仕様です。クライアントとオリジン・サーバー間のサロゲートまたはプロキシとして配置され、動的コンテンツのキャッシュで動的ページを組み立てるための統一プログラミング・モデルの開発を目的としています。
ESIは、Oracle Web Cacheによるフラグメントの動的コンテンツ・アセンブリを可能にするXMLに類似したマークアップ言語です。テンプレート・ページにESIマークアップ・タグを設定し、このタグによって動的HTMLフラグメントをフェッチおよび挿入します。フラグメント自体にESIマークアップを含めることも可能です。テンプレート・ページおよびHTMLフラグメントにキャッシュ・ルールを割り当てることができます。オリジン・サーバーではなく、Oracle Web Cacheでページ・アセンブリを実行可能にすることによって、キャッシュ・ヒット率が高くなり、パフォーマンスが向上します。
この章の項目は次のとおりです。
ESI言語リリース1.0仕様の詳細は、http://www.esi.orgを参照してください。
Oracle Web Cacheでは、キャッシュ可能およびキャッシュ不可の両方のページ・フラグメントを使用したWebページの動的アセンブリが可能です。Webページを異なるキャッシュ・プロファイルのフラグメントに分割することにより、このような動的アセンブリを可能にしています。これらのフラグメントは、キャッシュ内で別々の要素として管理されます。そして、エンド・ユーザーによってリクエストされたときに、適宜フラグメントがHTMLページの組立てに使用されます。
オリジン・サーバーではなくOracle Web CacheでのWebページの動的アセンブリを可能にすることにより、組み立てられたページの一部のフラグメントをキャッシュできます。ページの部分的なキャッシュによって、キャッシュ可能なHTMLコンテンツ数が大幅に増加します。これらのコンテンツは、リクエストされた時点でOracle Web Cacheによって組み立てられ、配信されます。さらに、HTTPリクエスト・ヘッダーまたはエンド・ユーザーのCookieで指定される情報に基づいたページ・アセンブリが可能になります。
アプリケーション開発者がページの部分的なキャッシュのためにコンテンツの組立てに使用する基本的な構造は、フラグメントが含まれているテンプレート・ページです。図11-1に示すように、テンプレートは、ロゴ、ナビゲーション・バー、フレームワーク、およびページのその他のルック・アンド・フィールなどの共通要素で構成されます。フラグメントは、ページの動的なサブセクションを示します。
テンプレート・ページは、エンド・ユーザーがリクエストするURLに関連付けられています。フラグメントを挿入できるように、テンプレート・ページにはESIマークアップ・タグが構成されており、このタグによってHTMLフラグメントをフェッチおよび挿入するようOracle Web Cacheに指示します。フラグメント自体は、ディスクリート・テキストまたはその他のオブジェクトが含まれているHTMLファイルです。
挿入される各フラグメントは、独自のキャッシュ・ポリシーを持つ別々のオブジェクトです。コンテンツ・プロバイダによって、テンプレートを数日間キャッシュ内に存続可能にし、広告や株価などの特定のフラグメントは、数秒または数分間しかキャッシュに存在しないようにします。その他のフラグメント(ユーザーの銀行口座の残高など)はキャッシュ不可に設定することが可能です。
表11-1に、主なESIタグのサマリーを示します。
表11-1 ESIタグのサマリー
| タグ | 説明 |
|---|---|
|
|
ブール式に基づく条件処理を実行します。 |
|
|
出力に含まれないコメントを指定します。 |
|
|
HTTPレスポンスで変数を使用できるようにします。 |
|
|
HTMLフラグメントを挿入します。 |
|
|
フラグメントを、個別にキャッシュ可能なフラグメントとして指定し、別のオブジェクトのHTTPレスポンスに埋め込む。 |
|
|
ブラウザ・ページのレスポンス内の無効化リクエストを指定します。 |
|
|
ESI処理が不可の場合に非ESIマークアップを指定します。 |
|
|
オリジン・サーバーにアクセスできずにリクエストが失敗した場合の代替処理を指定します。 |
|
|
環境変数の変数置換を許可します。 |
例11-1に、図11-1に示したテンプレート・ページのESIマークアップ言語を示します。
例11-1 ESIマークアップ
<HTML> <HEAD> <TITLE> Company.com </TITLE> </HEAD> <BODY> ... <!-- The following <esi:comment> tags are removed if this page is processed by an ESI processor. --> <!--esi <esi:comment text="This is the HTML source when ESI is enabled." /> <esi:comment text="Start: The quick link section. You cannot use the standard HTML comments because the end of that comment tag would disrupt the HTML comment tag with 'esi' following the two '-'." /> <esi:comment text="The URI query string parameter 'sessionID' is used to carry session identifiers, The session ID is encoded in all links." /> <esi:comment text="'Profile' refers to environment variables stored in GetProfile.jsp. GetProfile.jsp enables access to 'PersonalInterest.' 'zipcode,' 'tickers,' and 'address' environment variables." /> <esi:environment src="/GetProfile.jsp?sessionID=$(QUERY_STRING{sessionID})" name="Profile" /> <esi:vars> <A HREF="/shopping.jsp?sessionID=$(QUERY_STRING{sessionID})"> <IMG SRC="/img/shopping.gif"> </A> <A HREF="/news.jsp?sessionID=$(QUERY_STRING{sessionID})"> <IMG SRC="/img/news.gif"> </A> <A HREF="/sports.jsp?sessionID=$(QUERY_STRING{sessionID})"> <IMG SRC="/img/sports.gif"> </A> <A HREF="/fun.jsp?sessionID=$(QUERY_STRING{sessionID})"> <img src="/img/fun.gif"> </A> <A HREF="/about.jsp?sessionID=$(QUERY_STRING{sessionID})"> <iMG SRC="/img/about.gif"> </A> </esi:vars> <esi:comment text="End: The quick link section" /> ... <H3>Local Weather</H3> <esi:include src="/weather.jsp?sessionID=$(QUERY_STRING{sessionID})&zipcode=$(Profile{zipcode})" /> ... <H3>Stock Quotes</H3> <esi:try> <esi:attempt> <esi:include src="/CompanyStock.jsp?sessionID=$(QUERY_ STRING{sessionID})&tickers=$(Profiles{tickers})" /> </esi:attempt> <esi:except> The company stock quote is temporarily unavailable. </esi:except> </esi:try> ... <H3>What's New at Company</H3> <!-- This section is a static file that does not carry session information --> <esi:include src="/whatisnew.html" /> ... <H3>Today's News</h3> <esi:choose> <esi:when test="$(Profile{PersonalInterests}) == 'Sports'"> <H4>Sport News</H4> <esi:include src="/SportNews.jsp?sessionID=$(QUERY_STRING{sessionID})" /> </esi:when> <esi:when test="$(Profile{PersonalInterests}) == 'Career'"> <H4>Financial News</H4> <esi:include src="/FinancialNews.jsp?sessionID=$(QUERY_STRING{sessionID})" /> </esi:when> <esi:otherwise> <H4>General News</H4> <esi:include src="/DefaultNews.jsp?sessionID=$(QUERY_STRING{sessionID})" /> </esi:otherwise> </esi:choose> ... --> <!-- This is the HTML source when ESI is disabled. --> <esi:remove> Alternative HTML source that does not use ESI goes here. This tag enables you to disable ESI on the fly without redeveloping or redeploying a different version of the page. </esi:remove> ... </BODY> </HTML>
例11-2に、プロファイル環境変数へのアクセスを提供するGetProfile.jspのXMLレスポンスを示します。
例11-2 GetProfile.jspのXMLレスポンス
<?xml version=1.0?> <esi:environment esiversion="ORAESI/9.0.4"> <PersonalInterests>Sports</PersonalInterests> <zipcode>94065</zipcode> <tickers>ORCL,YHOO</tickers> <address>500 Oracle Parkway, Redwood Shores, CA 94065</address> </esi:environment>
ESIは、HTML、XML、JSP、ASPおよびその他のあらゆるWebプログラミング・テクノロジとともに使用可能です。ESI言語には、次の機能があります。
組込み
ESIプロセッサは、ネットワークから取得した動的コンテンツのHTTPまたはHTTPSフラグメントを使用して、ユーザーに出力する統合ページを組み立てます。各フラグメントに、独自のキャッシュ・ルールを設定可能です。
変数のサポート
ESIでは、HTTPリクエストの属性に基づいた変数と、組み込まれたHTMLフラグメントのカスタム変数の使用をサポートしています。変数は、処理時にESI文によって使用したり、処理されたマークアップに直接出力することができます。
条件処理
ESIでは、ページ処理の方法を決定するための条件論理に、ブール比較を使用できます。
エラー処理および代替処理
一部のESIタグでは、プライマリ・リソースが見つからない場合に使用する、デフォルトのリソースや代替リソース(代替のWebページなど)の設定をサポートしています。さらに、明示的な例外処理文ブロックが提供されています。
キャラクタ・セットの変換
異なるキャラクタ・セットのESIフラグメントがある場合、1つのキャラクタ・セットに変換されます。これにより、特定のキャラクタ・セットで、ページは組み立てられます。キャラクタ・セットの変換は次の方法で行われます。
Oracle Web Cacheがテンプレート・ページのリクエストを受信します。
Oracle Web Cacheがフラグメントをフェッチし、すべてのフラグメントをテンプレートのキャラクタ・セットに変換します。デフォルトのキャラクタ・セットはISO-8859-1です。
ESIを使用していないページに対しては、Oracle Web Cacheはキャラクタ・セットの変換を行いません。
XMLからHTMLへの変換
Oracle Web Cacheでは、XSL Transformations(XSLT)を使用して、XMLフラグメントをHTMLに変換します。
Oracle Web Cacheでは、ESIのタグおよび機能との便利なインタフェースとしてJESIタグ・ライブラリが提供されています。加えて、JESIタグ・ライブラリをOracle WebLogic Server上に配置することができます。どのようなWebアプリケーションであっても、開発者はESIタグを直接使用することができますが、JSP環境下でJESIタグを使用するとさらに便利になります。
ESIおよびJESIはオープン標準であるため、Oracle Web CacheのようなESIプロセッサが使用可能であれば、標準的なJSP環境の下で、JESIタグ・ライブラリを使用できます。
JSP開発者もESIを使用可能ですが、JESIを使用すると、新しい構文を習得しなくても、ページのモジュール構成や、それらのモジュールがキャッシュ可能かどうかということを簡単に示すことが可能です。
Oracle WebLogic Server上でのJESIの使用方法は、次を参照してください。
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/webcache/index.html
表11-2に、Oracle Web CacheがサポートするESI言語タグ、要素および属性を示します。一番右の列には、各ESIタグ、属性または要素をサポートする機能セットがすべて指定されています。たとえば、<esi:invalidate>タグをサポートしているのは、"ESI-INV/1.0"機能セットのみです。Oracle Web Cacheで処理を正確に実行するために、Surrogate-Controlレスポンス・ヘッダーのcontent制御ディレクティブで、ESIテンプレートが使用するすべての機能セットを指定します。ただし、直接または間接的にテンプレートに挿入されるESIフラグメント内で使用される機能セットを指定する必要があります。たとえば、ESIテンプレートで、<esi:invalidate>タグ、および<esi:log>要素を含む<esi:environment>タグが使用されている場合は、次のようにcontent制御ディレクティブに"ESI-INV/1.0"と"ORAESI/9.0.4"を含める必要があります。
Surrogate-Control: content="ESI-INV/1.0 ORAESI/9.0.4"
Surrogate-Controlレスポンス・ヘッダーの構成方法の詳細は、第6.10項を参照してください。
表11-2 ESI言語の機能
| ESI言語の機能 | 関連項目 | Surrogate-Controlレスポンス・ヘッダーのcontent="value"制御ディレクティブでサポートされる機能 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ESI言語仕様1.0およびEdgeアーキテクチャ仕様については、http://www.esi.org/spec.htmlを参照してください。
Oracle Web CacheでESIタグを処理できるように、ESIタグを使用するページのHTTPレスポンス・メッセージに、HTTP Surrogate-Controlレスポンス・ヘッダー・フィールドを設定します。
Surrogate-Control: content="ESI-INV/1.0 ORAESI/9.0.4"
キャッシュ内のリクエストされた各オブジェクトに対し、Oracle Web CacheによってSurrogate-Capabilityリクエスト・ヘッダー・フィールドがオブジェクトのHTTPリクエスト・メッセージに追加されます。Surrogate-Capabilityリクエスト・ヘッダーは次の目的に使用できます。
アプリケーションでOracle Web Cacheを検出できるようにします。
Oracle Web Cacheが実行できるESI操作の種類を識別します。
Surrogate-Capabilityリクエスト・ヘッダーにより、Oracle Web Cacheは、キャッシュとして機能するオリジン・サーバーに対して実行可能な操作を特定できます。Surrogate-Capabilityリクエスト・ヘッダー・フィールドは次のような構文をサポートします。
Surrogate-Capability: orcl="operation_value operation_value ..."
"operation_value"は次のいずれか(複数可)の値を示します。
"ORAESI/9.0.4": コンテンツ・アセンブリおよびページの部分的なキャッシュに使用するOracle独自の拡張ESIタグを処理します。"ORAESI/9.0.4"では、10g(9.0.4)以降のOracle Web Cacheで提供されるすべてのESIタグがサポートされます。
"ORAESI/9.0.2": コンテンツ・アセンブリおよびページの部分的なキャッシュに使用するOracle独自の拡張ESIタグを処理します。"ORAESI/9.0.2"では、リリース2(9.0.2および9.0.3)のOracle Web Cacheで提供されるすべてのESIタグがサポートされます。
"webcache/1.0": <!-- WEBCACHETAG-->タグおよび<!-- WEBCACHEEND-->タグを使用してパーソナライズ属性を処理します。
"ORAESI/9.0.2"、"ESI/1.0"および"ESI-Inline/1.0"は、"ORAESI/9.0.4"のサブセットです。このリリースでは、ESIアセンブリに"ORAESI/9.0.4"のみを、インライン無効化に"ESI-INV/1.0"のみを、パーソナライズ属性に"webcache/1.0"のみを指定する必要があります。
各operation_valueに対してサポートされるESIタグの詳細は、表11-3を参照してください。
ESIの要素と属性はXML構文に準拠しますが、HTMLやXMLオブジェクトなど、他のオブジェクトに埋込み可能です。Oracle Web Cacheによってページが処理される際、ESI要素自体は出力から削除されます。
ESI構文は、基本的にXML構文規則に準拠します。タグの使用の際には、次の点に注意してください。
ESIタグおよび属性は、大文字と小文字を区別します。
通常は小文字です。
サポートされているCGI環境変数は、大文字と小文字を区別します。
通常は大文字です。
ESIでは、等号(=)の前後、および"<"と"esi:"の間には、空白を使用できません。
次に、無効な構成を示します。
<esi:include src = "www.foo.com"/>
次に、正しい構成を示します。
<esi:include src="www.foo.com"/>
例11-3に示すように、ESIタグにはESI要素およびその他のHTMLマークアップをネストすることが可能です。
例11-3 ESI要素のネスト
<esi:choose>
<esi:when test="$(HTTP_HOST) == 'www.company.com'">
<esi:include src="/company.html" />
<h4>Another</h4>
<esi:include src="/another.html" />
</esi:when>
<esi:when test="$(HTTP_COOKIE{fragment) == 'First Fragment'">
<esi:try>
<esi:attempt>
<esi:include src="/fragment1.html" />
</esi:attempt>
<esi:except>
<esi:choose>
<esi:when test="$(HTTP_COOKIE{otherchoice}) == 'image'" >
<img src="/img/TheImage.gif">
</esi:when>
<esi:otherwise>
The fragment is unavailable.
</esi:otherwise>
</esi:choose>
</esi:except>
</esi:try>
</esi:when>
<esi:otherwise>
The default selection.
</esi:otherwise>
</esi:choose>
ESIでは、<esi:environment>タグとともに使用されるHTTPリクエスト変数および環境変数をサポートしています。
この項では、次の項目について説明します。
カスタム変数の挿入方法は、第11.4.3項を参照してください。
変数を参照するには、ドル記号の接頭辞を入力し、変数名をカッコで囲みます。
$(VARIABLE_NAME)
次に例を示します。
$(HTTP_HOST)
変数には、次のように、キーを使用してアクセスします。
$(VARIABLE_NAME{key})
変数のサブストラクチャにアクセスするには、アクセスするキーを中カッコで囲み、それを変数名に追加します。次に例を示します。
$(HTTP_COOKIE{username})
キーには大文字・小文字の区別とオプションがあります。キーを指定しない場合は、環境変数によって環境フラグメントの全内容が返されます。環境が空かどうかをテストする場合のみ、キーなしで環境変数を指定するようお薦めします。次のESIマークアップの$(logindata)は、null値に対して評価される変数です。
<esi:environment src="/getlogindata" name="logindata"/>
<esi:include src="/login/$(logindata{account})"/">
<esi:choose>
<esi:when test="$(logindata) != null">
<esi:include src="/login/$(logindata{account})"/>
</esi:when>
<esi:otherwise>
<esi:include src="/login/guest.html"/>
<esi:otherwise>
</esi:choose>
論理演算子OR(|)を使用すると、次の書式でデフォルト値を指定できます。
$(VARIABLE|default)
変数にデフォルト値を使用するのは、変数またはそのキーが存在しない場合のみです。変数が空の文字列と評価された場合は、デフォルト値ではなく、空の文字列が返されます。
次の例では、リクエストにCookie idが存在しない場合、Oracle Web Cacheによってhttp://example.com/default.htmlがフェッチされます。
<esi:include src="http://example.com/$(HTTP_COOKIE{id}|default).html"/>
他のリテラルと同様、空白を指定する場合は、デフォルト値を引用符で囲む必要があります。次に例を示します。
$(HTTP_COOKIE{first_name}|'new user')
|
注意: HTTP_HOSTおよびHTTP_REFERERはデフォルト値をサポートしていません。 |
表11-3に、ESIでサポートされているHTTPリクエスト変数を示します。次のことに注意してください。
QUERY_STRINGを除き、変数の値は、HTTPリクエスト・ヘッダー・フィールドから取得されます。QUERY_STRINGの場合、値はHTTPリクエスト・ボディまたはURLから取得されます。
変数は、ESIタグで囲まれている場合のみ解析されます。
サブストラクチャ・タイプが「リスト」または「ディクショナリ」と示されている変数には、キーを使用してアクセスします。
サブストラクチャ・タイプが「ディクショナリ」と示されている変数は、該当するキーによって文字列へのアクセスを可能にします。
「ディクショナリ」のキーには大文字・小文字の区別があります。
サブストラクチャ・タイプが「リスト」と示されている変数は、リクエストされた値が存在するかどうかにより、ブール値を返します。
表11-3 ESIでサポートされているHTTPリクエスト変数
| 変数名 | HTTPヘッダー・フィールド | サブストラクチャ・タイプ/変数タイプ | 説明 | 例 |
|---|---|---|---|---|
|
レスポンスに使用する言語セットを指定します。言語はキーとして使用されます。 |
リスト/ブール |
キーとして使用する言語を指定し、HTTPリクエスト・ヘッダーで指定される言語を評価します。 |
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果: |
|
|
Cookieの名前と値のペアを指定します。Cookie名がキーとして使用されます。
|
ディクショナリ/文字列 |
キーとして使用するCookie名を指定し、そのCookieの値を返します。 |
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果: |
|
|
任意のHTTPリクエスト・ヘッダー。 |
ディクショナリ/文字列 |
キーとして使用するHTTPリクエスト・ヘッダー名を指定し、そのヘッダーの値を返します。 |
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果: 次を返します。
|
|
|
リソースのホスト名およびポート番号を指定します。デフォルトのポート番号はポート80です。 |
該当なし/文字列 |
|
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果: 次を返します。
|
|
|
参照するリソースのURLを指定します。 |
該当なし/文字列 |
|
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果: 次を返します。
|
|
|
|
リクエストを送信したWebブラウザ・タイプ、ブラウザのバージョン、またはオペレーティング・システムを指定します。 |
ディクショナリ/文字列 |
次の3つのキーから1つを指定します。 |
変数の設定:
HTTPリクエスト・ヘッダーの内容:
結果:
結果:
結果: |
|
|
該当なし。 |
ディクショナリ/文字列 |
問合せ文字列に含まれるパラメータ名を指定し、URLエンコーディングされていないパラメータ値を返します。問合せ文字列は、URLまたはリクエスト・ボディに含まれています。 関連項目: URLエンコーディングの詳細は、 |
変数の設定:
問合せリクエストの内容:
結果: デコードされた |
|
|
該当なし。 |
該当なし/文字列 |
エンコードされた問合せ文字列全体を返すように指定します。 |
変数の設定:
問合せリクエストの内容:
結果: エンコードされた問合せ文字列全体を返します。
|
|
|
該当なし。 |
ディクショナリ/文字列 |
問合せ文字列に含まれるパラメータ名を指定し、URLエンコーディングされたパラメータ値を返します。問合せ文字列は、URLまたはリクエスト・ボディに含まれています。 |
変数の設定:
問合せリクエストの内容:
結果: エンコードされた
|
|
|
該当なし。 |
該当なし/文字列 |
|
変数の設定:
問合せリクエストの内容:
結果: エンコードされた問合せ文字列全体を返します。
|
|
該当なし。 |
ディクショナリ/文字列 |
|
変数の設定:
問合せリクエストの内容:
結果: デコードされた |
ESIでは、ESIフラグメント・リクエスト時に発生した例外の処理に、複数のメカニズムを使用します。開発しているビジネス・ロジックによって、特定の状況で、すべてのメカニズムを同時に使用、または1つのみを使用できます。
最初のメカニズムはESI言語に含まれているもので、エラー発生時のコンテンツ・アセンブリを詳細に制御するために3つの要素が提供されています。
<esi:include>タグのsrc属性を使用して指定したフラグメントがフェッチできない場合は、alt属性を使用して指定したフラグメントを代替として使用します。alt属性を使用しない場合、またはフラグメントがフェッチできない場合は、onerror属性を使用します。onerror属性をtry |attempt |exceptブロックの前に使用します。try |attempt |exceptブロックが存在しない場合は、例外処理が親またはテンプレート・ページに伝播されます。ESI言語制御がすべて失敗した場合、Oracle Web Cacheには、フラグメント用のデフォルト・ページが表示されます。
次の各項を参照してください。
<esi:inline>タグおよび<esi:include>タグを使用すると、アプリケーションでESIによるページの断片化とアセンブリを行うことができます。次に示す項では、これらのタグおよび目的に応じた使用方法について説明します。
既存のアプリケーションの大部分は、Webページ全体をHTTPリクエストに出力するように設計されています。このようなページのフラグメントおよびテンプレートはフェッチ不可、つまり、オリジン・サーバーを経由しないでフェッチすることはできません。キャッシュでこのようなフラグメントまたはテンプレートが必要になった場合には、対応するWebページ全体をリクエストする必要があります。フェッチ不可フラグメントを使用してESIによるページ・アセンブリを行うときには、アプリケーションは通常の場合と同様にページ全体のレスポンスを出力しますが、各フラグメントの最初と最後の部分に、フラグメントを区別するためのフラグメント名を指定した<esi:inline>タグが挿入されます。Oracle Web Cacheはタグで囲まれた部分を個別のフラグメントとして保存し、タグで囲まれたフラグメントのない元のページをテンプレートとして保存します。名前が同じで、同じサイトからのフラグメントが複数存在する場合、そのフラグメントはテンプレート間で共有されていることを示します。
例11-4に、単純な<esi:inline>タグの例を示します。<esi:inline>タグで囲まれているHTMLの表はフラグメント・コンテンツを示します。<esi:inline name="/news101">より前の部分および</esi:inline>より後の部分はページのテンプレートになります。別のページにある<esi:inline>タグにも同じ"/news101"という名前が設定されている場合、この2つのフラグメントは同じコンテンツを論理的に共有していることになります。
例11-4 フェッチ不可の場合のinlineタグの例
<HTML> ... <esi:inline name="/news101"> <TABLE> ... </TABLE> </esi:inline> ... </HTML>
フェッチ不可の<esi:inline>フラグメントをアプリケーションで使用する場合、キャッシュ・ミスが発生するたびにページ全体をリクエストする必要があります。最初のうちは、キャッシュ・ミスの場合はキャッシュの明白な利点はないように思われることもあります。しかし、フェッチ不可の<esi:inline>フラグメントを使用すると、次の利点によりキャッシュ機能が全般的に改善されます。
キャッシュ・ヒット率の向上
共有フラグメントをそれぞれ別々のフラグメントとして抽出することができるので、動的な部分のサイズが小さくなります。要求される領域の範囲が狭くなるため、ページ全体をキャッシュするよりもキャッシュ・ヒット率が高くなります。
キャッシュの更新頻度の削減
動的な共有フラグメントは1回の更新しか必要としません。たとえば、株式市場に関する共有フラグメントは、ページ内のその他のフラグメントよりもかなり頻繁に期限切れになることがあります。そのような場合、<esi:inline>タグを使用してページを断片化すると、キャッシュに格納されているページのうち、このフラグメントを含んでいるいずれかのページ全体を1回更新すれば、このフラグメントを共有しているすべてのページ全体が最新の状態に更新されます。そのため、フェッチ不可の<esi:inline>フラグメントであっても、キャッシュの更新頻度を大幅に削減することができます。コストの削減は共有の程度に比例します。
フェッチ不可のフラグメントを無効にするには、テンプレート・オブジェクトとフェッチ不可のフラグメントの両方を無効にして、フラグメントを確実に無効にする必要があります。
<esi:inline>フラグメントは、デフォルトではフェッチ不可です。アプリケーションでそれぞれ別々にフェッチ可能なフラグメントをサポートしている場合、<esi:inline>タグをフェッチ可能なフラグメントに使用するには、fetchable属性をyesに設定します。
例11-5に、/news101というフェッチ可能なフラグメントに使用する<esi:inline>タグの例を示します。このページをリクエストすると、テンプレート・ページとフェッチ可能なフラグメントが返されます。
例11-5 フェッチ可能な場合のinlineタグの例
<HTML> ... <esi:inline name="/news101" fetchable="yes"> <TABLE> ... </TABLE> </esi:inline> ... </HTML>
fetchable属性の詳細は、第11.1.8.2項を参照してください。
動的コンテンツのキャッシュおよびアセンブリで使用できるように、<esi:include>タグを使用して、HTTP出力にフラグメントとテンプレートを定義する方法もあります。このタグは、多くの点で<esi:inline>タグと似ています。それは、定義されたフラグメントの名前を定義定します。<esi:include>タグを含んでいるページは、定義されたフラグメントを参照するテンプレートになります。しかし、このタグには<esi:inline>タグとは基本的に異なっている点がいくつかあるため、使用方法も次のように大きく異なっています。
テンプレート内の<esi:include>タグは、フラグメントの参照のみを定義します。
それは、テンプレート内の埋込みフラグメントを直接囲みません。そのため、<esi:include>タグの埋め込まれたテンプレートを複数のユーザーに対して使用することができます。一方、<esi:inline>タグの埋め込まれたテンプレートは、各ユーザーに固有のものでなければなりません。
<esi:include>タグによって参照されるフラグメントは、必ず、HTTPまたはHTTPSによって別々にフェッチ可能なフラグメントでなければなりません。
リクエストされるURLはフラグメント名と同じになります。一方、<esi:inline>タグの名前はフラグメントを区別するだけのものであり、実際のコンテンツのフェッチには使用されません。<esi:include>フラグメントでフラグメント名を定義する属性は、nameではなくsrcです。
<esi:include>タグを使用すると利点がある例として、次の2つをあげることができます。
アプリケーションの中には、たとえばWebポータルのように、外部ソースからコンテンツを組み立てるものがあります。アプリケーションの役割は、サード・パーティのソースから各種のフラグメントをフェッチするために使用されるテンプレートを提供するのみです。このような場合、<esi:include>タグを使用するとフェッチと組立てが直接行われるので、1層分の冗長性が削減されます。
アプリケーションによっては、<esi:inline>タグを使用したページ全体のリクエストよりも、テンプレートのみのリクエストの方がレスポンスが速い場合があります。<esi:include>タグをページの断片化とアセンブリに使用する場合、大部分またはすべてのフラグメントがすでにキャッシュされていると、Oracle Web Cacheがキャッシュ・ミスするのはテンプレートのみとなるので、キャッシュ・ミスにかかる実際のコストの節減になります。パーソナライズされたテンプレートについては変更されることがほとんどないため、多くの場合、そのようなテンプレートをキャッシュすることにも利点があります。
例11-1に、<esi:include>タグを使用したESIマークアップの例を示します。
Oracle Web Cacheでは、<esi:include>と<esi:inline>の両方でクライアント・ブラウザ用のフラグメントをフェッチすることができますが、このタスクを実行する場合は<esi:include>の方が強力であり、かつフラグメントを容易に管理できます。<esi:include>はアプリケーション・フローに影響するため、アプリケーションの設計フェーズの初期段階で<esi:include>を組み込むのが最善の方法です。既存のアプリケーションの場合、アプリケーションの変更を最小限に抑えることができるため、<esi:inline>のメカニズムの方が効率的です。
Oracle Web Cacheは、テンプレート・ページに対して、Refererリクエスト・ヘッダー・フィールドが含まれたリクエストをクライアントから受信すると、そのRefererリクエスト・ヘッダー付きのリクエストをオリジン・サーバーに転送します。次に、オリジン・サーバーは、Refererヘッダーに対する値として、テンプレートのURLを付けてOracle Web Cacheにフラグメントを戻します。この機能によって、フラグメント・リクエストとテンプレート・リクエストが関連付けられます。
ESIテンプレートおよびフラグメントを使用する場合のセッションCookieの設定の仕組みは、次のような特徴がある点を除いては、Oracle Web Cacheでの通常のオブジェクトの場合とほとんど同じです。
Cookieリクエスト・ヘッダー・フィールドの継承
クライアントがフラグメントを含むESIテンプレート・ページをリクエストすると、フラグメント・ページのリクエストがOracle Web Cacheで生成されます。フラグメント・リクエスト内のHostリクエスト・ヘッダー・フィールドの値が、テンプレート・リクエスト内のHostリクエスト・ヘッダー・フィールドの値と一致する場合、フラグメント・リクエストはテンプレート・リクエストからCookieリクエスト・ヘッダー・フィールドを継承します。
Set-Cookieレスポンス・ヘッダー・フィールドの蓄積
フラグメントのアセンブリが完了すると、Oracle Web Cacheは、レスポンス内のSet-Cookieレスポンス・ヘッダー・フィールドにテンプレートのCookie情報を取り込みます。Hostリクエスト・ヘッダー・フィールドがテンプレートのHostリクエスト・ヘッダー・フィールドと一致するフラグメントの場合、Oracle Web Cacheは、Set-Cookieレスポンス・ヘッダー・フィールドに、テンプレートのSet-Cookieレスポンス・ヘッダー・フィールドの情報を蓄積します。Hostリクエスト・ヘッダー・フィールドがテンプレートのHostリクエスト・ヘッダー・フィールドと一致しないフラグメントの場合、Oracle Web Cacheは、Set-Cookieレスポンス・ヘッダー・フィールドに、テンプレートおよび他の一致するフラグメントのSet-Cookieレスポンス・ヘッダー・フィールドの情報を蓄積しません。
ESIマークアップにおけるHTTP_COOKIE変数の使用方法は、第11.1.6項を参照してください。
ページの部分的なキャッシュの概要は、第11.1項を参照してください。
この項では、フラグメントによるWebページの動的アセンブリ、およびキャッシュ可能またはキャッシュ不可のページ・フラグメント用ルールの作成方法について説明します。次のトピックが含まれます:
ページの部分的なキャッシュを使用するには、次の手順を実行します。
次の手順に従って、テンプレート・ページを構成します。
フラグメントをフェッチして挿入するには、テンプレート内でESIマークアップ・タグを使用します。
|
重要 <!-- WEBCACHETAG-->タグおよび<!-- WEBCACHEEND-->タグが含まれているページでは、ESIタグは使用できません。単純なパーソナライズを必要とし、ESIを使用している場合は、第11.2.2項「単純なパーソナライズでのESIの使用」を参照してください。 |
テンプレート・ページで、HTTPレスポンスにSurrogate-Controlレスポンス・ヘッダー・フィールドを設定します。次に例を示します。
Surrogate-Control: max-age=30+60, content="ORAESI/9.0.4"
テンプレート・ページに必要なすべてのキャッシュ属性がSurrogate-Controlレスポンス・ヘッダー・フィールドに含まれていない場合は、そのページのキャッシュ・ルールを作成します。
フェッチ可能フラグメントを設定します。
HTTPレスポンス・メッセージに、Surrogate-Controlレスポンス・ヘッダー・フィールドを使用します。
フラグメントに必要なすべてのキャッシュ属性がSurrogate-Controlレスポンス・ヘッダー・フィールドに含まれていない場合は、そのフラグメントのキャッシュ・ルールを作成します。
詳細は、次を参照してください。
単純なパーソナライズには変数式を使用できます。
たとえば、次のHTMLでは、クライアントのブラウザからusernameというCookieで渡される値に基づいてユーザー名を置換しています。さらに、sessionIDというCookieに含まれているセッション情報を使用して、セッション情報がユーザーごとに置換されます。
次のESIマークアップにより、同じ結果が得られます。
<esi:vars>
Welcome $(HTTP_COOKIE{'username'})!
Here is a <A HREF="/jsp/myPage.jsp?sessionID=$(QUERY_STRING{'sessionid'})">link</A>.
</esi:vars>
<esi:vars>タグを使用すると、ESIタグの外部でESI環境変数を使用できます。変数は、他のESIタグでも使用可能です。
次の各項を参照してください。
この項では、ESIの使用例を示します。次の項目が含まれます。
図11-2に、Markという登録ユーザーのポータル・サイト・レスポンス・ページhttp://www.company.com/servlet/oportal?username=Markを示します。
このページは、Oracle Web Cacheによって組み立てられます。パーソナライズされた挨拶文、気象情報、株式情報、販促広告、ニュースおよびスポーツなどのフラグメントに関してESIマークアップ・タグによって構成されたテンプレート・ページは、Markの環境設定に基づいて組み立てられます。たとえば、Markがサンフランシスコの気象情報を選択すると、アプリケーションはサンフランシスコの気象情報を検索し、その結果を最終的なHTMLページに出力します。これは動的コンテンツなので、このページはキャッシュできません。一方、ESIマークアップ・タグを使用している場合、Oracle Web Cacheで大部分のコンテンツの組立てとキャッシュが行われます。
次の項では、<esi:inline>タグおよび<esi:include>タグを使用してテンプレート・ページやそのフラグメントを実装する方法を説明します。
この項では、<esi:inline>タグの断片化やアセンブリによって、リアルタイム要素が含まれないページの動的コンテンツ・キャッシュの有効性が大幅に向上する仕組みについて説明します。フェッチ不可フラグメントをサポートする既存のアプリケーションに<esi:inline>タグを適用する方法を示します。<esi:inline>タグによりキャッシュ・コンテンツの容量が減少し、動的コンテンツを独立させることでキャッシュ・ヒット率が向上します。
|
注意: アプリケーションでそれぞれ別々にフェッチ可能なフラグメントをサポートしている場合、<esi:inline>タグをフェッチ可能なフラグメントに使用するには、fetchable属性をyesに設定します。fetchable属性の詳細は、第11.4.5項を参照してください。 |
<esi:inline>タグを使用するには、portal.esi内の論理フラグメントを<esi:inline>タグでマークします。パーソナライズされた挨拶文、「Weather Forecast」、「My Stocks」、「Promotion」キャンペーン、「Latest News」および「Latest Sports News」には個別のキャッシュ・プロパティがあり、共有可能なため、これらは必然的にフラグメントとなります。「My Stock」フラグメントは、さらに個別の株価に対応する5つのサブフラグメントに細分されます。さらにフラグメントを最大限共有できるように、2つのパーソナライズされたフラグメントに共通するHTMLコード・セクションをESIフラグメントとして囲み、特定の名前を付けます。これにより、様々なテンプレートに含まれる共通データを最小限に抑えることができます。
例11-6に、<esi:inline>タグ付きのportal.esiを示します。
例11-6 inlineタグ付きのportal.esi
<esi:inline name="/Common_Fragment_1" >
<!-- First common fragment -->
<HTML>
...
<!-- Personalized Greeting With ESI variable -->
Welcome, $(QUERY_STRING{username})!
</esi:inline>
<esi:inline name="/Weathers_San_Francisco" >
...
<!-- Personalized Weather Forecast -->
Weather Forecast for San Francisco
<TABLE>
<TR>
<TD>
Currently: 50F
</TD>
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Common_Fragment_2" >
<!-- Second common fragment -->
...
</esi:inline>
<esi:inline name="/Stocks_$(QUERY_STRING{username})" >
<!-- Personalized Stock Quote Selections -->
<TABLE>
<TR>
<TD>
<esi:inline name="/ticker_IBM">
IBM 84.99
</esi:inline>
<BR>
<esi:inline name="/ticker_ORCL">
ORCL 13.379
</esi:inline>
<BR>
<esi:inline name="/ticker_YHOO">
YHOO 27.15
</esi:inline>
<TD>
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Common_Fragment_3">
<!-- Third common fragment -->
...
</esi:inline>
<esi:inline name="/ExternalAdvertisement">
<!-- External Advertisement -->
<TABLE>
<TR>
<TD>
<a href="http://www.companyad.com/advert?promotionID=126532">
<img src="http://www.companyad.com/advert_img?promotionID=126532">
</a>
</TD>
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Common_Fragment_4">
<!-- Fourth common fragment -->
...
</esi:inline>
<esi:inline name="/Top_News_Finance">
<!-- Personalized Top News -->
Latest News for finance
<TABLE>
<TR>
Tech Spending Growth Indexes Little Changes
Home Sales Hit Record High
Gas Prices Dip Again
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Sports_News_Soccer" >
<!-- Personalized Sports News -->
Latest Sports News for Soccer
<TABLE>
<TR>
Preparation for World Cup
Youth Cup game on a Sunday
Latest Scores
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Common_Fragment_5" >
...
</esi:inline>
例11-7に、パーソナライズされた挨拶文のマークアップを示します。フラグメントは、個々のユーザーに属するすべてのパーソナライズ・ページに共通です。このフラグメントには<esi:inline>タグによって特定の名前が割り当てられるため、たとえばJohnなどの別のユーザーが、同じ名前の同じフラグメントを自身のテンプレートに持つこともあります。2つのフラグメントは、それらの名前が同一である場合に限って共有されます。これにより、すべてのテンプレートに含まれる同一の共有フラグメントが期限切れまたは無効な場合、必要となる更新は1回で済みます。$(QUERY_STRING{username})は、usernameの値へのアクセスを提供するESI環境変数です。この変数がここで使用されているのは、このアプリケーションがusername問合せ文字列パラメータを使用してユーザー名を渡すためです。この変数を使用することにより、最初のフラグメントがすべてのユーザーに共有されます。
例11-7 inlineタグ付きのportal.esiの例: パーソナライズされた挨拶文
<esi:inline name="/Common_Fragment_1" >
<!-- First common fragment -->
<HTML>
...
<!-- Personalized Greeting With ESI variable -->
Welcome, $(QUERY_STRING{username})!
</esi:inline>
例11-8に、「Weather Forecast」のマークアップを示します。フラグメントは各都市に固有です。同じ都市を選択する各テンプレートは、フラグメントのネーミング上、このフラグメントをMarkのページと共有することになります。
例11-8 inlineタグ付きのportal.esiの例: Weather Forecast
<esi:inline name="/Weathers_San_Francisco" >
<!-- Personalized Weather Forecast -->
Weather Forecast for San Francisco
<TABLE>
<TR>
<TD>
Currently: 50F
</TD>
</TR>
</TABLE>
</esi:inline>
例11-9に、「My Stocks」のマークアップを示します。株価フラグメントは、Markのページにあるすべての指定銘柄を囲みます。このフラグメントは、ネストされた<esi:inline>タグを使用して、さらに個別の指定銘柄に対応する5つのサブフラグメントに細分されます。したがって、MarkのESIテンプレートはMarkの選択株フラグメントを参照し、さらに指定銘柄のフラグメントを参照します。指定銘柄は多数のユーザーの選択株フラグメントによって共有されますが、選択株フラグメント自体はMarkの固有のテンプレートでもあります。このマークアップよって固有の情報が共有情報から分離され、キャッシュの更新と個人の選択株に割り当てられる領域を大幅に抑制できます。
例11-9 portal.esiの例: 「My Stocks」フラグメント
<esi:inline name="/Stocks_$(QUERY_STRING{username})" >
<!-- Personalized Stock Quote Selections -->
<TABLE>
<TR>
<TD>
<esi:inline name="/ticker_IBM">
IBM 84.99
</esi:inline>
<BR>
<esi:inline name="/ticker_ORCL">
ORCL 13.379
</esi:inline>
<BR>
<esi:inline name="/ticker_YHOO">
YHOO 27.15
</esi:inline>
<TD>
</TR>
</TABLE>
</esi:inline>
例11-10に、「Promotion」セクションの広告を参照するマークアップを示します。promotionIDは、ユーザー識別情報に基づくIDです。
例11-10 inlineタグ付きのportal.esiの例: Promotion
<esi:inline name="/ExternalAdvertisement">
<!-- External Advertisement -->
<TABLE>
<TR>
<TD>
<a href="http://www.companyad.com/advert?promotionID=126532">
<img src="http://www.companyad.com/advert_img?promotionID=126532">
</a>
</TD>
</TR>
</TABLE>
</esi:inline>
レスポンスのたびに変化する入替式広告は、フェッチ不可ESI <esi:inline>キャッシュを利用する価値がないリアルタイム・コンテンツの一例です。フェッチ不可ESIのinlineフラグメントとしてわずかな部分でもリアルタイム・コンテンツが埋め込まれている場合、常にレスポンス全体を再生成してフェッチする必要があります。このようなリアルタイム・フラグメントにESIおよび動的コンテンツのキャッシュを使用するには、<esi:include>タグを使用します。
リアルタイム広告に<esi:include>タグを使用する例は、第11.2.3.1.2項を参照してください。
「Latest News」および「Latest Sports News」のフラグメントは、気象情報のフラグメントと同様です。共通する領域もすべてフラグメントとして定義されます。これらをテンプレートの一部として残しておくこともできますが、記憶領域を浪費します。例11-11に、マークアップを示します。
例11-11 inlineタグ付きのportal.esiの例: 「Latest News」および「Latest Sports News」
<esi:inline name="/Top_News_Finance">
<!-- Personalized Top News -->
Latest News for finance
<TABLE>
<TR>
Tech Spending Growth Indexes Little Changes
Home Sales Hit Record High
Gas Prices Dip Again
</TR>
</TABLE>
</esi:inline>
<esi:inline name="/Sports_News_Soccer" >
<!-- Personalized Sports News -->
Latest Sports News for Soccer
<TABLE>
<TR>
Preparation for World Cup
Youth Cup game on a Sunday
Latest Scores
</TR>
</TABLE>
</esi:inline>
この項では、<esi:include>タグを使用して、テンプレートにコンテンツが埋め込まれていないフェッチ可能なフラグメントの断片化およびアセンブリを行う方法について示します。
例11-12に、<esi:include>タグ付きのportal.esiを示します。
例11-12 includeタグ付きのportal.esi
<HTML>
...
<!-- Personal Profile -->
<esi:comment text="Profile refers to environment variables stored in
/servlet/GetProfile. GetProfile servlet enables access to a set of environment
variables with personal profile information."/>
<esi:environment src="/servlet/GetProfile?username=$(QUERY_STRING{username})"
name="Profile"/>
...
<!-- Personalized Greeting With ESI variable -->
<esi:vars>Welcome, $(QUERY_STRING{username})!</esi:vars>
...
<!-- Personalized Weather Forecast -->
<TABLE>
<TR>
<TD>
<esi:include src="/servlet/Weather?city=$(Profile{city})&state=$(Profile{state})"/>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Stock Quote Selections -->
<TABLE>
<TR>
<TD>
<esi:include src="/servlet/PersonalizedStockSelection?username=$(QUERY_STRING{username})"/>
</TD>
</TR>
</TABLE>
...
<!-- External Advertisement -->
<TABLE>
<TR>
<TD>
<esi:try>
<esi:attempt>
<esi:comment text="Include an ad"/>
<esi:include src="/servlet/Advert"/>
</esi:attempt>
<esi:except>
<esi:comment text="Just write an HTML link instead"/>
<A HREF="http://www.oracle.com">http://www.oracle.com</a>
</esi:except>
</esi:try>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Top News -->
Latest News for <esi:vars>$(Profile{news})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{news}) == 'Internet'">
<esi:include src="/servlet/News?type=Top&topic=internet"/>
</esi:when>
<esi:when test="$(Profile{news}) == 'finance'">
<esi:include src="/servlet/News?type=Top&topic=business"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Top&topic=technology"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Sports News -->
Latest Sports News for <esi:vars>$(Profile{sport})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{sport}) == 'golf'">
<esi:include src="/servlet/News?type=Sports&topic=golf"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'soccer'">
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'basketball'">
<esi:include src="/servlet/News?type=Sports&topic=basketball"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'baseball'">
<esi:include src="/servlet/News?type=Sports&topic=baseball"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
例11-13では、GetProfileに格納されている環境変数を参照するようにProfileを指定しています。GetProfileは、挿入されるフラグメントのパラメータとして使用されているユーザー・プロファイル変数へのアクセスを可能にします。
例11-13 portal.esiの例: カスタム・プロファイル環境変数の設定
<!-- Personal Profile -->
<esi:comment text="Profile refers to environment variables stored in
/servlet/GetProfile. GetProfile servlet enables access to a set of environment
variables with personal profile information."/>
<esi:environment src="/servlet/GetProfile?username=$(QUERY_STRING{username})"
name="Profile"/>
例11-14に、環境変数city、state、newsおよびsportsへのアクセスを可能にするGetProfileを示します。
例11-14 portal.esiの例: 環境変数付きのGetProfileファイル
<?xml version="1.0"?> <esi-environment esiversion="ORAESI/9.0.4"> <city>San_Francisco</city> <state>CA</state> <news>finance</news> <sports>soccer</sports> </esi-environment>
例11-15に、パーソナライズされた挨拶文「Welcome, Mark!」のマークアップを示します。パーソナライズされた挨拶文は、URLに埋め込まれたusernameパラメータに基づいて挨拶文を作成する、<esi:vars>タグによって実現されます。usernameパラメータは、登録ユーザーの名前です。このマークアップは、キャッシュ可能なテンプレート・ページにパーソナライズされた挨拶文を含めることを可能にします。
例11-15 varsタグ付きのportal.esiの例: パーソナライズされた挨拶文
<esi:vars>Welcome, $(QUERY_STRING{username})!</esi:vars>
例11-16に、「Weather Forecast」のマークアップを示します。「Weather Forecast」にはサーブレット・フラグメント名Weatherが含まれます。これは、GetProfile内でユーザーのcityおよびstate環境変数の値を使用して、ユーザーに適切な天気予報を表示します。GetProfileのcity環境変数の値はSan Francisco、state環境変数の値はCaliforniaであるため、カリフォルニア州サンフランシスコの天気予報が表示されます。
例11-16 includeタグ付きのportal.esiの例: Weather Forecast
<TABLE>
<TR>
<TD>
<esi:include src="/servlet/Weather?city=$(Profile{city})&state=$(Profile{state})"/>
</TD>
</TR>
</TABLE>
例11-17に、「My Stocks」のマークアップを示します。「My Stocks」には、PersonalizedStockSelectionというサーブレット・フラグメントが含まれます。表示される株価は、URLにエンコードされたuserIDパラメータに基づきます。userIDは、登録ユーザーの一意のIDです。
例11-17 includeタグ付きのportal.esiの例: 「My Stocks」フラグメント
<TABLE>
<TR>
<TD>
<esi:include src="/servlet/PersonalizedStockSelection?username=$(QUERY_STRING{username})"/>
</TD>
</TR>
</TABLE>
例11-18に、挿入されているフラグメントPersonalizedStockSelectionのマークアップを示します。3つの株価フラグメントIBM、ORCLおよびYHOOが含まれています。
例11-18 portal.esiの例: MarkのPersonalizedStockSelectionフラグメント
<TABLE>
<TR>
<TD>
<BR>
<esi:include src="Quote?symbol=IBM"/>
<BR>
<esi:include src="Quote?symbol=ORCL"/>
<BR>
<esi:include src="Quote?symbol=YHOO"/>
<BR>
</TD>
</TR>
</TABLE>
出力はユーザーごとに異なるため、PersonalizedStockSelectionフラグメントはキャッシュできません。ただし、内部の株価に対するレスポンスはキャッシュ可能で、複数のユーザー間で株価を共有できます。多数のユーザーが株価を共有していても、株価が更新された場合、1回のブラウザの再ロードのみ必要です。たとえば、例11-19に、Scottという別のユーザーのPersonalizedStockSelectionフラグメントを示します。3つの株価フラグメントIBM、ORCLおよびSCOが含まれています。前述のとおり、IBMとORCLはMarkと共有されています。Markが先にページを再ロードして株価をキャッシュすると、ScottのIBMとORCLの株価も自動的に更新されます。
例11-19 portal.esiの例: ScottのPersonalizedStockSelectionフラグメント
<TABLE>
<TR>
<TD>
<BR>
<esi:include src="Quote?symbol=IBM"/>
<BR>
<esi:include src="Quote?symbol=ORCL"/>
<BR>
<esi:include src="Quote?symbol=SCO"/>
<BR>
</TD>
</TR>
</TABLE>
例11-20に、「Promotion」セクションの入替式広告のマークアップを示します。広告は、レスポンスのたびに変化するということで入れ替わるようになっています。Oracle Web Cacheでは、挿入されるイメージ・フラグメントのレスポンスの生成をテンプレート・ページから切り離すことにより、テンプレートをキャッシュしつつ、動的な広告をテンプレートに統合できます。
例11-20 includeタグ付きのportal.esiの例: Promotion
<TABLE>
<TR>
<TD>
<esi:try>
<esi:attempt>
<esi:comment text="Include an ad"/>
<esi:include src="/servlet/Advert"/>
</esi:attempt>
<esi:except>
<esi:comment text="Just write an HTML link instead"/>
<A HREF="www.oracle.com">www.oracle.com</a>
</esi:except>
</esi:try>
</TD>
</TR>
</TABLE>
例11-21に示すように、バナーに挿入されるイメージ・フラグメントのレスポンスはキャッシュできません。ユーザーがこのページをリクエストすると、バナーを生成するリクエストがOracle Web CacheからWebアプリケーション・サーバーに送信されます。Webアプリケーション・サーバーから、Advertサーブレットによってリクエストのバナーが生成されます。
例11-21 portal.esiの例: 入替式バナーの出力
<TABLE>
<TR>
<TD>
<A HREF="http://www.companyad.com/redirect?refID=11934502">
<IMG src="http://www.companyad.com/advert_img?refID=11934502"></A>
</TD>
</TR>
</TABLE>
例11-22に示すように、ユーザーが次にページを再ロードすると、Advertサーブレットによってそのリクエスト用に別のバナーが生成されます。
例11-22 portal.esiの例: 入替式バナーの再ロード
<TABLE>
<TR>
<TD>
<A HREF="http://www.companyad.com/redirect?refID=123456602">
<IMG src="http://www.companyad.com/advert_img?refID=123456602"></A>
</TD>
</TR>
</TABLE>
バナーは、<esi:try>タグの代替処理によって表示されます。Advertサーブレットを実行できない場合は、www.oracle.comへのリンクがバナーの位置に表示されます。
例11-23に、「Latest News」および「Latest Sports News」のマークアップを示します。
「Latest News」では、ユーザーがnewsカテゴリでinternet、finance、technologyのいずれを選択したかに基づき、<esi:choose>タグを使用した条件処理によって、ニュース・ヘッドラインが表示されます。GetProfileのnews環境変数値がfinanceであるため、金融関連の/servlet/News?type=Top&topic=businessのヘッドラインが表示されます。
同様に「Latest Sports News」では、ユーザーがsportsカテゴリでgolf、soccer、basketball、baseball、soccerのいずれを選択したかに基づき、条件処理によってスポーツ・ヘッドラインが表示されます。GetProfileのsports環境変数値がsoccerであるため、サッカー関連の/servlet/News?type=Sports&topic=soccerのヘッドラインが表示されます。
例11-23 includeタグ付きのportal.esiの例: 「Latest News」および「Sports」セクション
Latest News for <esi:vars>$(Profile{news})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{news}) == 'internet'">
<esi:include src="/servlet/News?type=Top&topic=internet"/>
</esi:when>
<esi:when test="$(Profile{news}) == 'finance'">
<esi:include src="/servlet/News?type=Top&topic=business"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Top&topic=technology"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
...
<!-- Personalized Sports News -->
Latest Sports News for <esi:vars>$(Profile{sport})</esi:vars>
<TABLE>
<TR>
<TD>
<esi:choose>
<esi:when test="$(Profile{sport}) == 'golf'">
<esi:include src="/servlet/News?type=Sports&topic=golf"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'soccer'">
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'basketball'">
<esi:include src="/servlet/News?type=Sports&topic=basketball"/>
</esi:when>
<esi:when test="$(Profile{sport}) == 'baseball'">
<esi:include src="/servlet/News?type=Sports&topic=baseball"/>
</esi:when>
<esi:otherwise>
<esi:include src="/servlet/News?type=Sports&topic=soccer"/>
</esi:otherwise>
</esi:choose>
</TD>
</TR>
</TABLE>
ESI変数はHTMLタグ内で使用可能です。たとえば例11-24で考えてみます。この例のHTMLコードでは、テキスト・ボックスが含まれるHTMLフォームにPL/SQLが使用されています。
例11-24 パーソナライズされていないPL/SQLコード
htp.p('<form action="test" method="GET">');
htp.p('<table border="0" >
<tr>
<td><input type="text" name="p_name" size="8" value="'||p_name||'"></td>
</tr>
<tr>
<td><input type="submit" value="Search"></td>
</tr>
</table>');
例11-25に、<esi:vars>タグとともに$HTTP_COOKIE変数を使用して、p_nameの値をユーザー名に置換する方法を示します。
Edge Side Includes(ESI)の一部として実装されるインライン無効化は、オリジン・サーバーに対して、Web Cacheに送信されたトランザクション・レスポンスに無効化メッセージを組み合せる便利な方法を提供します。たとえば、顧客がE-Commerceサイトでベジタリアン向けの料理本を購入した場合、確認レスポンスにその書籍、著者および野菜に関連するすべてのカタログ・ページを無効にする指示を含めることができます。無効化メッセージをインラインで送信する機能により、バンド外無効化の送信に関連する接続オーバーヘッドが軽減されるため、ESI開発者には便利なツールです。
インライン無効化を構成するには、次の手順を実行します。
テンプレート・ページで、次のようにcontent="ESI-INV/1.0"を含むSurrogate-Controlレスポンス・ヘッダー・フィールドをHTTPレスポンスで構成します。
Surrogate-Control: content="ESI-INV/1.0"
同じレスポンスのボディで、<esi:invalidate>タグを使用して、基本インライン無効化リクエストまたは拡張インライン無効化リクエストを挿入します。
インライン無効化リクエストは、ESIテンプレートのどの部分にも挿入できます。複数のリクエストを挿入できますが、処理されるのは最初のリクエストのみです。インライン無効化の実行はブロック化します。つまり、ESIテンプレートに他のESI機能が含まれている場合は、インライン無効化が最初に実行されます。
基本無効化の構文を次に示します。
<esi:invalidate [output="yes"]> <?xml version="1.0"?> <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATION VERSION="WCS-1.1"> <SYSTEM> <SYSTEMINFO NAME="name" VALUE="value"/> </SYSTEM> <OBJECT> <BASICSELECTOR URI="URL"/> <ACTION REMOVALTTL="TTL"/> <INFO VALUE="value"/> </OBJECT> </INVALIDATION> </esi:invalidate>
拡張無効化の構文を次に示します。
<esi:invalidate [output="yes"]> <?xml version="1.0"?> <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATION VERSION="WCS-1.1"> <SYSTEM> <SYSTEMINFO NAME="name" VALUE="value"/> </SYSTEM> <OBJECT> <ADVANCEDSELECTOR URIPREFIX="prefix" URIEXP="URL_expression" HOST="host_name:port" METHOD="HTTP_request_method" BODYEXP="HTTP_body"/> <COOKIE NAME="cookie_name" VALUE="value"/> <HEADER NAME="HTTP_request_header" VALUE="value"/> <OTHER NAME="URI|BODY|QUERYSTRING_PARAMETER|SEARCHKEY" TYPE="SUBSTRING|REGEX" VALUE="value"/> </ADVANCEDSELECTOR> </OBJECT> </INVALIDATION> </esi:invalidate>
詳細は、次を参照してください。
次に、簡単なWebアプリケーションでインライン無効化を使用する自転車のオンライン・ショップの例を示します。この例では、Perlで書かれた2つのCGIスクリプトを使用します。show_bike.plは、特定モデルの自転車の在庫がどれだけあるかを示します。このスクリプトではデータベースの問合せが行われ、購入が発生するまでその結果が変更されないため、show_bike.plはキャッシュされます。buy_bike.plは自転車を購入する顧客によって使用されます。このページがリクエストされると、show_bike.plは有効ではなくなるため、無効化が必要になります。
例11-26に、show_bike.plのコードを示します。
例11-26 show_bike.plのコード
#!/usr/local/bin/perl # first, retrieve how many bikes are in stock # and assign it to $nBikes (omitted!) print <<END; Content-Type: text/html Cache-Control: private Surrogate-Control: max-age=3600 <html> <body> <h1>Bike: model 2005</h1> <p>There are $nBikes bike(s) in stock for purchase!</p> <p>Click <a href="/cgi/buy_bike.pl">here</a> to purchase a bike.</p> </body> </html> END
max-age=3600は、このページをキャッシュできる時間が最大1時間であることをOracle Web Cacheに通知します。
例11-27に、インライン無効化リクエストを含むbuy_bike.plのコードを示します。
例11-27 インライン無効化リクエストを含むbuy_bike.plのコード
#!/usr/local/bin/perl print <<END; Content-Type: text/html Cache-Control: private Surrogate-Control: content="ESI/1.0 ESI-INV/1.0" <html> <body> <h1>Thank you for purchasing bike model 2000.</h1> <p>Click <a href="/cgi/show_bike.pl">here</a> to read more about this model.</p><esi:invalidate><?xml version="1.0"?> <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATION VERSION="WCS-1.1"> <OBJECT> <BASICSELECTOR URI="/cgi/show_bike.pl"/> <ACTION REMOVALTTL="0"/> </OBJECT> </INVALIDATION></esi:invalidate><p>Thanks again!</p> </body> </html> END
Surrogate-Control内のESI-INV/1.0トークンによって、Oracle Web Cacheに<esi:invalidate>タグの処理が指示されます。
例11-28に、buy_bike.plのブラウザ・レスポンスを示します。Oracle Web Cacheでインライン無効化リクエストをすでに処理済であるため、インライン無効化はレスポンス内に存在しません。
例11-28 buy_bike.plのブラウザ・レスポンス
Content-Type: text/html Cache-Control: private Surrogate-Control: content="ESI/1.0 ESI-INV/1.0" <html> <body> <h1>Thank you for purchasing bike model 2000.</h1> <p>Click <a href="/cgi/show_bike.pl">here</a> to read more about this model.</p> <p>Thanks again!</p> </body> </html>
デバッグのヒント
デバッグを容易にするために、アプリケーション開発者は、次を実行できます。
次のように、"ESI-INV/1.0"を含むSurrogate-Capabilityリクエスト・ヘッダーを追加します。
Surrogate-Capability: content="ESI-INV/1.0"
インライン無効化でSurrogate-Capabilityリクエスト・ヘッダーが追加されると、Oracle Web Cacheは無効化リクエストをレスポンスに挿入します。
<esi:invalidate>タグのoutput属性を有効化します。
output属性が有効化されると、Oracle Web Cacheは無効化の結果をコメント<!--result-->で囲んだ状態でレスポンスに挿入します。
例11-29に示すbuy_bike.plのブラウザ・レスポンスでは、Surrogate-Capabilityリクエスト・ヘッダーでインライン無効化が有効になり、<esi:invalidate>タグのoutput属性が有効になっています。
例11-29 インライン無効化の診断情報を含むshow_bike.plのブラウザ・レスポンス
Content-Type: text/html Cache-Control: private Surrogate-Control: content="ESI/1.0 ESI-INV/1.0" <html> <body> <h1>Thank you for purchasing bike model 2000.</h1> <p>Click <a href="/cgi/show_bike.pl">here</a> to read more about this model.</p><esi:invalidate output="yes"><?xml version="1.0"?> <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATION VERSION="WCS-1.1"> <OBJECT> <BASICSELECTOR URI="/cgi/show_bike.pl"/> <ACTION REMOVALTTL="0"/> </OBJECT> </INVALIDATION></esi:invalidate><!--<?xml version="1.0"?> <!DOCTYPE INVALIDATIONRESULT SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATIONRESULT VERSION="WCS-1.1"> <OBJECTRESULT> <BASICSELECTOR URI="/cgi/show_bike.pl/> <RESULT ID="1" STATUS="SUCCESS" NUMINV="1"/> </OBJECTRESULT> </INVALIDATIONRESULT>--><p>Thanks again!</p> </body> </html>
この項では、ページの部分的なキャッシュ処理に使用されるESIタグについて説明します。次のものがあります。
<esi:choose>、<esi:when>、<esi:otherwise>の各条件タグにより、ブール式に基づいてロジックを実行することができます。
<esi:choose>
<esi:when test="BOOLEAN_expression">
Perform this action
</esi:when>
<esi:when test="BOOLEAN_expression">
Perform this action
</esi:when>
<esi:otherwise>
Perform this other action
</esi:otherwise>
</esi:choose>
各<esi:choose>タグには1つ以上の<esi:when>タグが必要で、オプションで1つの<esi:otherwise>タグを含めることが可能です。
Oracle Web Cacheでは、test属性がtrueと評価された最初の<esi:when>タグが実行され、その後<esi:choose>タグが終了します。trueと評価される<esi:when>タグがなく、<esi:otherwise>タグが存在する場合は、その要素のコンテンツが実行されます。
<esi:when>要素または<esi:otherwise>要素内に、他のHTMLまたはESI要素を含めることができます。
test属性では、trueまたはfalse論理の評価方法を決定するためにブール式を使用します。ESIでは、次のブール演算子をサポートしています。
==(等しい)
!=(等しくない)
>(より大きい)
<(未満)
>=(以上)
<=(以下)
&(および)
|(または)
!(ではない)
ブール式の使用方法に関して、次の点に注意してください。
オペランドは、左から右へ対応付けられています。
明示的に関連付けを示すには、式の一部をカッコで囲んでグループ化します。
両方のオペランドが数値である場合、式は数式として評価されます。
いずれかのオペランドが数値以外の場合、いずれのオペランドも文字列として評価されます。たとえば、'a'==3は'a'=='3'と評価され、3は文字列として評価されます。
2つのブール式を比較すると、未定義の操作となります。
オペランドが空または未定義の場合、式は常にfalseと評価されます。
論理演算子(&、!、|)は式の修飾に使用しますが、比較には使用できません。
定数文字列には一重引用符(')を使用します。たとえば、次の文字列は有効です。
$(HTTP_COOKIE{name})=='typical'
一重引用符のエスケープ(\')は使用できません。たとえば、次の例はサポートされていません。
$(HTTP_COOKIE{'user\'s name'})=='typical'
算術操作および代入は使用できません。
null値は、変数が空かどうかを評価します。
数値をnullと比較すると、その数値は対応する文字列に変換され、空の文字列と比較されます。次のESIマークアップでは、$(logindata{name})はnameの値へのアクセスを提供する変数です。nameが空でnullと評価された場合、式はtrueと評価されます。一方、nameが空ではなく、nullと評価されない場合、式はfalseと評価されます。
|
注意: 変数が存在し、空の文字列と評価された場合、その値はnullとはみなされません。 |
<esi:choose>
<esi:when test="$(logindata{name}) == null">
<esi:include src=/login/$(logindata{name})"/>
</esi:when>
<esi:otherwise>
<esi:include src=/login/guest.html"/>
<esi:otherwise>
</esi:choose>
次の式に、ブール演算子の正しい使用方法を示します。
!(1==1)
!('a'<='c')
(1==1)|('abc'=='def')
(4!=5)&(4==5)
次の式に、ブール演算子の誤った使用方法を示します。
(1 & 4)
("abc" | "edf")
文は、<esi:when>サブタグまたは<esi:otherwise>サブタグ内に記述する必要があります。サブタグの外部にある文は、条件として評価されません。例11-30に、文の無効な配置を示します。
例11-30 文の配置
<esi:choose> This markup is invalid because any characters other than whitespace are not allowed in this area. <esi:when test="$(HTTP_HOST) == 'www.company.com'"> <esi:include src="/company.html" /> </esi:when> This markup is invalid because any characters other than whitespace are not allowed in this area. <esi:when test="$(HTTP_COOKIE{fragment) == 'First Fragment'"> <img src="/img/TheImage.gif"> </esi:when> This markup is invalid because any characters other than whitespace are not allowed in this area. <esi:otherwise> The default selection. </esi:otherwise> This markup is invalid because any characters other than whitespace are not allowed in this area. </esi:choose>
次のESIマークアップには、Cookie Advancedを使用するリクエスト用のadvanced.html、およびCookie Basicを使用するリクエスト用のbasic.htmlが含まれています。
<esi:choose>
<esi:when test="$(HTTP_COOKIE{group})=='Advanced'">
<esi:include src="http://www.company.com/advanced.html"/>
</esi:when>
<esi:when test="$(HTTP_COOKIE{group})=='Basic User'">
<esi:include src="http://www.company.com/basic.html"/>
</esi:when>
<esi:otherwise>
<esi:include src="http://www.company.com/new_user.html"/>
</esi:otherwise>
</esi:choose>
<esi:comment>タグにより、ESIの指示に関するコメントを出力に表示することなく追加できます。
<esi:comment>タグは、Oracle Web Cacheによって評価されません。コメントをHTML出力で表示するには、標準のXML/HTMLコメント・タグを使用してください。
<esi:environment>タグによって、挿入されたフラグメントのカスタム環境変数を含めることができます。含めた変数は他のESIタグとともに使用できます。
このタグには2つの形式があります。最初の形式では、<esi:environment>に終了の</esi:environment>タグが存在しません。
<esi:environment src="environment_URL" name="environment_name" [max-age="expiration_time[+removal_time]]" [method="GET|POST"] [onerror="continue"] [timeout="fetch_time"]/>
要素を含む2番目の形式では、<esi:environment>に終了の</esi:environment>タグが存在します。
<esi:environment src="environment_URL" name="environment_name" [max-age="expiration_time[+removal_time]"] [method="GET|POST"] [onerror="continue"] [timeout="fetch_time"]> [<esi:request_header name="request_header" value="value"/>] [<esi:request_body value="value"/>] [<esi:log>log_message</esi:log>] </esi:environment>
src: 環境変数とその値の取得元となるURLを指定します。
URLは、絶対URLでも、相対URLでも構いません。絶対URLを指定する場合は、次のいずれかの形式を使用します。
"http://host_name:port/path/filename"
"https://host_name:port/path/filename"
絶対URLにホスト名を指定する場合は、接頭辞としてhttp://またはhttps://を付加する必要があります。HTMLパーサーでは、次のURL内のhost:80が、ホスト名ではなくフォルダ名として扱われます。
src="host:80/index.htm"
このURLを有効にするには、次のように指定します。
src="http://host:80/index.htm"
相対URLは、テンプレート・ページに対して相対的に解決されます。その結果、現在のテンプレートのESI環境が設定されます。
URLのソース・コードには、次のXML形式が必要です。
<?xml version="1.0"?> <esi:environment esiversion="ORAESI/9.0.4"> <variable_name>variable_value</variable_name> <variable_name>variable_value</variable_name> </esi:environment>
name: 環境変数の参照に使用する名前を指定します。
method: 環境フラグメントの HTTPリクエスト・メソッドを指定します。有効な値はGETまたはPOSTです。
max-age: XMLファイルが期限切れになるまでの時間(秒)を指定します。オプションとして、期限切れになってからXMLファイルが削除されるまでの時間(秒)を指定します。
timeout: フラグメントをフェッチするまでの時間(秒)を指定します。フラグメントが指定時間内にフェッチされなかった場合、フェッチは中断されます。
onerror: srcオブジェクトのフェッチが失敗した場合、ESIタグを無視してページを表示するよう指定します。
request_body: フラグメントのHTTPリクエスト・ボディを指定します。
request_header: 使用するOracle Web CacheのHTTPリクエスト・ヘッダー・フィールドおよび値を指定します。
log: x-esi-infoログ・フィールドが設定されている場合は、access_log_file.fragmentファイルに挿入するフラグメントのログ・メッセージを指定します。フラグメントとそのフラグメントを生成したアプリケーションを識別する説明的なテキスト文字列を指定できます。説明的なテキストを指定することによって、ログ・ファイル内のフラグメントを簡単に識別でき、フラグメントがリクエストされる頻度を判断できます。
x-esi-infoログ・フィールドの詳細は、表9-5を参照してください。
テンプレート・ページごとに1つの<esi:environment>タグを指定してから、他のESIタグを指定します。
属性の順序は特に決められていません。
複数のrequest_body要素を指定しないでください。
request_header要素は0(ゼロ)個以上指定できます。
複数のHTTPリクエスト・ヘッダー・フィールドを指定するには、複数のrequest_header要素を使用します。
<esi:environment src="environment_URL" [max-age="expiration_time[+removal_time]"][method="GET|POST"] [onerror="continue"] [timeout="fetch_time"]> <esi:request_header name="request_header" value="value"/> <esi:request_header name="request_header" value="value"/> </esi:environment>
request_header要素が指定されていない場合、Oracle Web Cacheは親ページから他のリクエスト・ヘッダーを使用します。
複数のlog要素を指定しないでください。
詳細は、次を参照してください。
次のESI出力は、catalog.xmlに格納されている環境変数を参照するlogindataを示しています。ファイルcatalog.xmlにより、挿入されたURLのパラメータとして使用されているvendorID環境変数の値にアクセスできます。
<esi:environment src="/catalog.xml" name="logindata"/>
<esi:include src="http://provider.com/intranetprovider?vendorID=$(logindata{vendorID})"/>
ファイルcatalog.xmlの内容は、次のとおりです。
<?xml version="1.0"?> <esi:environment esiversion="ORAESI/9.0.4"> <product_description>stereo</product_description> <vendorID>3278</vendorID> <partner1>E-Electronics</partner1> <partner2>E-City</partner2> </esi:environment>
次のESI出力は、env.datに格納されている環境変数を参照するlogindataを示しています。ファイルenv.datにより、dir1.txtの挿入されたログ・メッセージのパラメータとして使用されているenv環境変数の値にアクセスできます。x-esi-infoログ・フィールドが設定されている場合にフラグメントがリクエストされると、dir1.txtおよびesi-log2.htmlのログ・メッセージがaccess_log.fragmentファイルに書き込まれます。
<esi:environment src="/esi/env.dat" name="env">
<esi:log>Used environment /esi/env.dat</esi:log>
</esi:environment>
<esi:include src="/cached/dir1.txt">
<esi:log>Fragment:/cache/dir1.txt is included, by $(env{xl_name})</esi:log>
</esi:include>
<font color="red">Including /cgi-bin/esi-fetch.sh?/esi/esi-log2.html in esi-log1.html </font>
<esi:include src="/cgi-bin/esi-fetch.sh?/esi/esi-log2.html">
<esi:log>Fragment: /cgi-bin/esi-fetch.sh?/esi/esi-log2.html is included
</esi:log>
<esi:include>タグにより、フラグメントの挿入に使用する構文が提供されます。
<esi:inline>と<esi:include>の使用方法の比較は、第11.1.8項を参照してください。
このタグには2つの形式があります。最初の形式では、<esi:include>に終了の</esi:include>タグが存在しません。
<esi:include src="URL_fragment" [alt="URL_fragment"] [max-age="expiration_time[+removal_time]]" [method="GET|POST"] [onerror="continue"] [redirect=yes|no] [timeout="fetch_time"]/>
要素を含む2番目の形式では、<esi:include>に終了の</esi:include>タグが存在します。
<esi:include src="URL_fragment" [alt="URL_fragment"] [max-age="expiration_time[+removal_time]"] [method="GET|POST"] [onerror="continue"] [redirect=yes|no] [timeout="fetch_time"]> [<esi:request_header name="request_header" value="value"/>] [<esi:request_body value="value"/>] [<esi:log>log_message</esi:log>] </esi:include>
src: フェッチするフラグメントのURLを指定します。URLは、リテラル文字列でも変数が含まれていても構いません。
URLは、絶対URLでも、相対URLでも構いません。絶対URLを指定する場合は、次のいずれかの形式を使用します。
"http://host_name:port/path/filename"
"https://host_name:port/path/filename"
絶対URLにホスト名を指定する場合は、接頭辞としてhttp://またはhttps://を付加する必要があります。HTMLパーサーでは、次のURL内のhost:80が、ホスト名ではなくフォルダ名として扱われます。
src="host:80/index.htm"
このURLを有効にするには、次のように指定します。
src="http://host:80/index.htm"
相対URLは、テンプレート・ページに対して相対的に解決されます。マークアップ内の要素は挿入された結果に置換されてブラウザに送信されます。
XMLファイルのフラグメントが有効なXMLである場合は、XMLフラグメントを指定できます。次の例では、Oracle Web CacheでXSL Transformation(XSLT)を使用して、スタイル・シートによってXMLをHTMLに変換するように指定しています。スタイル・シートは、XMLフォーマットをHTMLフォーマットにマップします。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="stylesheet.xsl"?>
XMLフラグメントとXSLスタイル・シートの両方のレスポンス・ページが、テキストとXMLのメディア・タイプを含むContent-Typeレスポンス・ヘッダー・フィールドで構成されていることを確認してください。次に例を示します。
Content-Type: text/xml
XSLTの詳細は、http://www.w3.org/TR/xsltを参照してください。
alt: srcが見つからない場合に代替リソースを指定します。値の要件はsrcと同じです。
max-age: フラグメントが期限切れになるまでの時間(秒)を指定します。オプションとして、期限切れになってからフラグメントが削除されるまでの時間(秒)を指定します。この属性は、失効したフラグメントに対するテンプレート・ページの許容値が、フラグメント・レスポンスの有効期限(TTL)パラメータで指定された値よりも高い場合に使用します。
method: フラグメントのHTTPリクエスト・メソッドを指定します。有効な値はGETまたはPOSTです。
onerror: srcオブジェクトのフェッチが失敗した場合、ESIタグを無視してページを表示するよう指定します。
redirect: srcフラグメントが一時的に異なるURLにある場合に、そのフラグメントの表示方法を指定します。yesを指定すると、そのURLがリダイレクトされて表示されます。noを指定すると、そのフラグメントのURLはリダイレクトされず、HTTPの302 Foundステータス・コードがフラグメントのかわりに表示されます。デフォルトはyesです。
timeout: フラグメントをフェッチするまでの時間(秒)を指定します。フラグメントが指定時間内にフェッチされなかった場合、フェッチは中断されます。
altおよびonerrorの使用時の注意事項は、第11.1.7項を参照してください。
request_body: フラグメントのHTTPリクエスト・ボディを指定します。
request_header: Oracle Web Cacheが使用するHTTPリクエスト・ヘッダーフィールドおよび値を指定します。複数のHTTPリクエスト・ヘッダーを指定できます。この属性を指定すると、親フラグメントまたはテンプレート・ページからのリクエスト・ヘッダーはすべて無視されます。
log: x-esi-infoログ・フィールドが設定されている場合は、access_log.fragmentファイルに挿入するフラグメントのログ・メッセージを指定します。フラグメントとそのフラグメントを生成したアプリケーションを識別する説明的なテキスト文字列を指定できます。説明的なテキストを指定することによって、ログ・ファイル内のフラグメントを簡単に識別でき、フラグメントがリクエストされる頻度を判断できます。
x-esi-infoログ・フィールドの詳細は、表9-5を参照してください。
<esi:include>では、最大3レベルのネストをサポートしています。
<esi:include>では、二重引用符のエスケープ(\")をサポートしていません。たとえば、次の例はサポートされていません。
<esi:include src="file\"user.htm"/>
属性の順序は特に決められていません。
src属性は、HTTPとHTTPSの両方をサポートしています。Oracle Web Cacheでは、テンプレートとフラグメントに異なるプロトコルの使用を許可しています。次のことに注意してください。
src属性で、src="/PersonalizedGreeting"のようにフラグメントの相対パスが指定されている場合は、テンプレートのプロトコルが使用されます。
src属性で使用されているプロトコルが、Oracle Web Cache Managerの「Site-to-Server Mapping」ページ(「Origin Servers, Sites, and Load Balancing」→「Site-to-Server Mapping」)で指定されたプロトコルと一致しない場合、Oracle Web Cacheは「Site-to-Server Mapping」ページでオリジン・サーバー用に設定されたプロトコルを使用します。さらに、Oracle Web Cacheは、次の警告メッセージをイベント・ログに記録します。
[Date] [warning 11250] [ecid: request_id, serial_number]
ESI include fragment protocol does not match origin server protocol:
Origin Server Protocol=protocol URL=URL
たとえば、テンプレート・ページで<esi:include> src="https://www.company.com:80/gifs/frag1.gif"/>と構成され、かつサイトからサーバーへのマッピングでHTTPがオリジン・サーバーに指定されている場合は、http://www.company.com:80/gifs/frag1.gifが使用され、次のメッセージがイベント・ログに記録されます。
[03/Feb/2005:23:16:46 +0000] [warning 11250] [ecid: 90125204378,0] ESI include fragment protocol does not match origin server protocol: Origin Server Protocol=http URL=https://www.company.com:80/gifs/frag1.gif
複数のrequest_body要素を指定しないでください。
request_header要素は0(ゼロ)個以上指定できます。
複数のHTTPリクエスト・ヘッダー・フィールドを指定するには、複数のrequest_header要素を使用します。
<esi:include src="URL_fragment" [max-age="expiration_time[+removal_time]"] [method="GET|POST"] [onerror="continue"] [timeout="fetch_time"]> <esi:request_header name="request_header" value="value"/> <esi:request_header name="request_header" value="value"/> </esi:include>
複数のlog要素を指定しないでください。
<esi:include>タグにより、src属性で指定されているフラグメントをフェッチするよう、Oracle Web Cacheに指示します。
処理が正しく実行されると、srcで指定されたURLからフェッチされたコンテンツが表示されます。オブジェクトは、includeタグの場所に挿入されます。たとえば、includeタグが表セル内に存在する場合、フェッチされたオブジェクトは表セル内に表示されます。
Surrogate-Controlレスポンス・ヘッダー・フィールドのmax-age制御ディレクティブはレスポンスに適用されます。max-age属性は、<esi:include>タグを介して、特定の使用方法のフラグメント・レスポンスにのみ適用されます。Surrogate-Controlレスポンス・ヘッダー・フィールドのmax-age制御ディレクティブおよびmax-age属性の両方が設定されている場合、この特定の組込みに適用される有効期限および削除期限は、それぞれ長い方の有効期限および削除期限となります。失効したフラグメントに対する特定ページの許容値が高い場合は、max-age属性をmax-age制御ディレクティブより長い値に設定します。max-age属性を使用して、削除時間までフラグメントを無効化した状態で表示することにより、キャッシュ・ヒット率を高めます。max-age=infinityは、オブジェクトを期限切れにしないようにする指定です。
methodが設定されていない場合は、GETとみなされます。ただし、request_body要素が設定されている場合は、POSTとみなされます。
Oracle Web Cacheにより、すべてのフラグメント・リクエストに次のHTTPリクエスト・ヘッダーが生成されます。
Host
Content-Length
Surrogate-Capability
Connection
request_header要素を使用すると、上記以外のHTTPヘッダーを制御できます。競合が発生してOracle Web Cacheの動作に影響することがあるため、これらのHTTPリクエスト・ヘッダーをrequest_header属性として指定しないでください。
request_header要素が指定されていない場合、Oracle Web Cacheは親ページから他のリクエスト・ヘッダーを使用します。
<esi:inline>と<esi:include>の使用方法の比較は、第11.1.8項を参照してください。
次のESIマークアップには、frag1.htmというファイルが含まれています。フラグメントは60秒以内にフェッチされます。フェッチに失敗した場合、Oracle Web Cacheはincludeを無視し、ページを表示します。フェッチに成功した場合、Oracle Web Cacheはフラグメントを挿入します。Oracle Web Cacheによってフラグメントは5分後に期限切れになり、さらに8分後に削除されます。
<esi:include src="/frag1.htm" timeout="60" maxage="300+480" onerror="continue"/>
次のESI出力には、動的問合せの結果が含まれます。
<esi:include src="/search?query=$QUERY_STRING(query)"/>
次のESI出力には、パーソナライズされた挨拶文、Cookie HTTPリクエスト・ヘッダーおよび日付を含むHTTPリクエスト・ボディが含まれます。x-esi-infoログ・フィールドが設定されている場合にフラグメントがリクエストされると、ログ・メッセージ"Fragment: /Personalized Greeting is included"がaccess_log.fragmentファイルに書き込まれます。
<esi:include src="/PersonalGreeting"> <esi:request_header name="Cookie" value="pname=Scott Tiger"/> <esi:request_body value="day=05, month=10, year=2001"/> <esi:log>Fragment: /Personalized Greeting is included</esi:log> </esi:include>
<esi:include>の具体的な使用例は、第11.2.3.1項を参照してください。
<esi:inline>タグは、フラグメントを、別のオブジェクトのHTTPレスポンスに埋め込まれる個別にキャッシュ可能なフラグメントとしてマークします。Oracle Web Cacheでは、これらのフラグメントを独立した<esi:include>フラグメントとして格納し、組み立てます。
<esi:inline>と<esi:include>の使用方法の比較は、第11.1.8項を参照してください。
<esi:inline name="URL" fetchable="yes|no" [max-age="expiration_time[+removal_time]"] [timeout="fetch_time"] Embedded HTML code </esi:inline>
name: フラグメントに一意の名前をURL形式で指定します。
fetchable: yesの場合、フラグメントが期限切れになると、Oracle Web Cacheはフラグメントをオリジン・サーバーからフェッチします。このフェッチ・プロセスでは、フラグメント用のテンプレートは挿入されません。noの場合、Oracle Web Cacheは、キャッシュ・ミスがあったときにテンプレート全体をオリジン・サーバーからフェッチし、テンプレートからすべてのフラグメントを抽出しようとします。
max-age: フラグメントが期限切れになるまでの時間(秒)を指定します。オプションとして、期限切れになってからフラグメントが削除されるまでの時間(秒)を指定します。この属性は、失効したフラグメントに対するテンプレート・ページの許容値が、フラグメント・レスポンスの有効期限(TTL)パラメータで指定された値よりも高い場合に使用します。
timeout: フラグメントをフェッチするまでの時間(秒)を指定します。フラグメントが指定時間内にフェッチされなかった場合、フェッチは中断されます。
一部のinlineフラグメントは、他のオブジェクトのHTTPレスポンスの一部としてのみ配信されます。Oracle Web Cacheでは、これらのフラグメントを<esi:include>フラグメントのように個々にフェッチすることはできません。フェッチ不可のフラグメントがOracle Web Cacheで必要な場合、inlineフラグメントが抽出されたオブジェクトをリクエストする必要があります。
フェッチ不可の<esi:inline>フラグメントがキャッシュ内で見つからない場合、フラグメントの親テンプレートがOracle Web Cacheによって再フェッチされます。この動作は、親テンプレートがさらにフェッチ不可な<esi:inline>フラグメントであってはならないということを意味します。親もフェッチ不可の<esi:inline>フラグメントであった場合、ブラウザに返されるレスポンスは未定義になります。
詳細は、次を参照してください。
次のESIの出力には、金融のヘッドラインが埋め込まれています。
<esi:inline name="/Top_News_Finance">
Latest News for Finance
<TABLE>
<TR>
Blue-Chip Stocks Cut Losses; Nasdaq Up MO
French rig factory with explosives New York Times
Volkswagen faces Brazil strike CNN Europe
Airbuss reliability record BBC
</TR>
</TABLE>
</esi:inline>
<esi:inline>の具体的な使用例は、第11.2.3.1項を参照してください。
<esi:invalidate>タグを使用すると、ブラウザ・ページのレスポンス内に無効化リクエストを構成できます。
基本無効化の構文を次に示します。
<esi:invalidate [output="yes"]>
<?xml version="1.0"?>
<!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd">
<INVALIDATION VERSION="WCS-1.1">
<SYSTEM>
<SYSTEMINFO NAME="name" VALUE="value"/>
</SYSTEM>
<OBJECT>
<BASICSELECTOR URI="URL"/>
<ACTION REMOVALTTL="TTL"/>
<INFO VALUE="value"/>
</OBJECT>
</INVALIDATION>
</esi:invalidate>
拡張無効化の構文を次に示します。
<esi:invalidate [output="yes"]> <?xml version="1.0"?> <!DOCTYPE INVALIDATION SYSTEM "internal:///WCSinvalidation.dtd"> <INVALIDATION VERSION="WCS-1.1"> <SYSTEM> <SYSTEMINFO NAME="name" VALUE="value"/> </SYSTEM> <OBJECT> <ADVANCEDSELECTOR URIPREFIX="prefix" URIEXP="URL_expression" HOST="host_name:port" METHOD="HTTP_request_method" BODYEXP="HTTP_body"/> <COOKIE NAME="cookie_name" VALUE="value"/> <HEADER NAME="HTTP_request_header" VALUE="value"/> <OTHER NAME="URI|BODY|QUERYSTRING_PARAMETER|SEARCHKEY" TYPE="SUBSTRING|REGEX" VALUE="value"/> </ADVANCEDSELECTOR> <ACTION REMOVALTTL="TTL"/> <INFO VALUE="value"/> </OBJECT> </INVALIDATION> </esi:invalidate>
output: yesを指定すると、無効化の結果がコメント<!--result-->に囲まれてブラウザ・レスポンスに含まれます。noを指定すると、無効化の結果は出力に表示されません。テスト環境では値yesを、本番環境では値noを指定します。
<esi:remove>タグを使用すると、Surrogate-ControlヘッダーでESI処理が使用可能になっていない場合、またはESI対応のキャッシュが存在しない場合に、ESI以外のマークアップによる出力を指定できます。
次のESIマークアップでは、<esi:include>コンテンツを挿入できない場合にhttp://www.company.comを挿入します。
<esi:include src="http://www.company.com/ad.html"/> <esi:remove> <A HREF="http://www.company.com">www.company.com</A> </esi:remove>
通常、Oracle Web Cacheは、この例のブロックを処理する際に、ad.htmlファイルをフェッチしてテンプレート・ページに挿入し、<esi:remove>タグとそのコンテンツを暗黙的に破棄します。ESI処理が使用不可の場合、すべての要素がブラウザに渡され、ブラウザによりESIマークアップが無視されます。ただし、ブラウザにより、<A HREF=...> HTMLリンクが表示されます。
<esi:try>タグは例外処理に使用します。<esi:try>タグには、<esi:attempt>タグが1つ、<esi:except>タグが1つ以上含まれている必要があります。altおよびonerrorの使用時の注意事項は、第11.1.7項を参照してください。
次の形式では、<esi:except>タグが1つだけサポートされます。
<esi:try> <esi:attempt> Try this... </esi:attempt> <esi:except> If the attempt fails, then perform this action... </esi:except> </esi:try>
次の形式では、タイプの異なる複数の<esi:except>タグがサポートされます。
<esi:try> <esi:attempt> Try this... </esi:attempt> <esi:except [type="type"]> If the attempt fails, then perform this action... </esi:except> <esi:except [type="type"]> Perform this action... </esi:except> <esi:except> If the attempt fails, then perform this action... </esi:except> </esi:try>
Oracle Web Cacheにより、最初に<esi:attempt>のコンテンツが処理されます。<esi:attempt>に失敗すると、エラーがトリガーされ、Oracle Web Cacheによって<esi:except>タグのコンテンツが処理されます。
一般的なエラーについてはタイプなしで<esi:except>タグを、特定のエラーについてはタイプとともに<esi:except>タグを指定します。<esi:except>タグには、次のタイプを指定できます(大文字小文字の区別はありません)。
nestingtoodeep: フラグメントの組込み深度が最大組込み深度を超えた場合に発生するエラー。
originserverbusy: そのフラグメントのオリジン・サーバーがビジー状態で、新規リクエストを受け入れることができないために発生するエラー。このエラーが発生するのは、Oracle Web Cacheからオリジン・サーバーへのリクエストのキューが限界に達したときです。
noconnection: キャッシュがそのフラグメントを処理するオリジン・サーバーに接続できないために発生するエラー。
networktimeout: オリジン・サーバーへのフラグメント・リクエストがネットワーク接続中にタイムアウトしたために発生するエラー。
httpclienterror: オリジン・サーバーが、HTTP 4xxステータス・コードを返すために発生するエラー(不正なHTTPリクエストや権限のないアクセスなどのクライアント・エラー)。
httpservererror: オリジン・サーバーがHTTP 5xxステータス・コードを返すために発生するエラー(サーバー・エラー)。
incompatiblefragmentversion: フラグメントの処理要件がサポートされていないかテンプレートとの互換性がないために発生するエラー。ESIフラグメントの<!-- WEBCACHETAG-->および<!-- WEBCACHEEND-->の処理にはESI処理との互換性はありません。フラグメントが、キャッシュ内での処理を必要としないプレーン・データであるか、このリリースでサポートされているESI機能の処理を必要とするESIテンプレート自体の可能性があります。使用するESI機能は、Surrogate-Control content制御ディレクティブで指定されています。
incorrectresponseheader: フラグメントのレスポンス・ヘッダーが原因で発生するエラー。
incorrectesifragment: Oracle Web CacheでESIフラグメント・レスポンスのボディのエラーを解析または処理しようとしたときに発生するエラー。
incorrectxmlfragment: Oracle Web CacheによるXSLTの取得、解析、または処理にエラーがあった場合に発生するエラー。
次のESIマークアップでは、広告のフェッチを試みています。広告を挿入できない場合、Oracle Web Cacheにより、かわりに静的リンクが挿入されます。
<esi:try>
<esi:attempt>
<esi:comment text="Include an ad"/>
<esi:include src="http://www.company.com/ad1.htm"/>
</esi:attempt>
<esi:except>
<esi:comment text="Just write some HTML instead"/>
<a href=www.company.com>www.company.com</a>
</esi:except>
</esi:try>
次のESIマークアップでは、フラグメントのフェッチを試みています。フラグメントがhttpclienterrorのために挿入できない場合、Oracle Web Cacheでは、/cgi-bin/esi-fetch?/esi/tryNestL1.htmlをかわりに挿入します。
<esi:try>
<esi:attempt>
<esi:include src="/frag.html"/>
</esi:attempt>
<esi:except type="httpclienterror">
<esi:include src="/cgi-bin/esi-fetch?/esi/tryNestL1.html"/>
</esi:except>
</esi:try>
次の<esi:try>では、複数のHTTPリクエスト・ヘッダーを含むフラグメントhttp://server.portal.com/pls/ppcdemo/!PCDEMO.wwpro_app_provider.execute_portlet/513104940/26の挿入を試みています。様々なtypeエラーが原因でフラグメントを挿入できない場合、Oracle Web Cacheでは、Unknown ESI Exceptionエラーを返します。
<esi:try>
<esi:attempt>
<esi:include src="http://server.portal.com/pls/ppcdemo/!PCDEMO.wwpro_app_provider.execute_portlet/513104940/26" timeout="15000" >
<esi:request_header name="X-Oracle-Device.MaxDocSize" value="0"/>
<esi:request_header name="Accept"
value="text/html,text/xml,text/vnd.oracle.mobilexml"/>
<esi:request_header name="User-Agent"
value="Mozilla/4.0 (compatible; MSIE 5.5; Windows; YComp 5.0.0.0)
RPT-HTTPClient/0.3-3"/>
<esi:request_header name="Device.Orientation" value="landscape"/>
<esi:request_header name="Device.Class" value="pcbrowser"/>
<esi:request_header name="PORTAL-SUBSCRIBER" value="us"/>
<esi:request_header name="Device.Secure" value="false"/>
<esi:request_header name="PORTAL-SUBSCRIBER-DN"
value="dc=us,dc=oracle,dc=com"/>
<esi:request_header name="PORTAL-SUBSCRIBER-GUID"
value="A5EE385440E6252BE0340800208A8B00"/>
<esi:request_header name="Accept-Language" value="en-us"/>
<esi:request_header name="PORTAL-USER-DN"
value="cn=public,cn=users,dc=us,dc=oracle,dc=com"/>
<esi:request_header name="PORTAL-USER-GUID"
value="A5EE55B396E22651E0340800208A8B00"/>
<esi:request_header name="Content-Type"
value="application/x-www-form-urlencoded"/>
</esi:include>
</esi:attempt>
<esi:except type="incompatiblefragmentversion" >
This happens when a fragment's processing requirement is not supported
or not compatible with the template.
</esi:except>
<esi:except type="noconnection" >
The cache is unable to connect to the origin server serving this fragment.
</esi:except>
<esi:except type="nestingtoodeep" >
The fragment include depth has exceeded the maximum include depth. The
default value defined in Web Cache is 3.
</esi:except>
<esi:except type="httpservererror" >
The origin server returns an HTTP 5xx status code, a server error.
</esi:except>
<esi:except type="httpclienterror" >
The origin server returns an HTTP 4xx status code, a client error, such as
a malformed HTTP request or an unauthorized access.
</esi:except>
<esi:except type="incorrectresponseheader" >
This happens when the response headers for a fragment cause the error.
</esi:except>
<esi:except type="incorrectxmlfragment" >
This happens when there is any kind of error in Oracle Web Cache XSLT
retrieval, parsing, or processing.
</esi:except>
<esi:except type="originserverbusy" >
The origin server for this fragment is busy and cannot accept new requests
now. This is caused by Oracle Web Cache-to-origin server request queue
limit.
</esi:except>
<esi:except type="networktimeout" >
This is thrown by a fragment whose request to the origin server has timed
out in the network connection.
</esi:except>
<esi:except type="incorrectesifragment" >
An error is encountered when Oracle Web Cache tries to parse or process
the ESI fragment response body due to errors in the body.
</esi:except>
<esi:except>
Unknown ESI Exception
</esi:except>
</esi:try>
<esi:vars>タグを使用すると、ESIタグの外部で変数を使用できます。たとえば、<esi:include>または<esi:choose>ブロック内で変数を指定するかわりに、<esi:vars>タグを使用して、HTMLコード内で変数を指定できます。
変数に完全な$(VARIABLE_NAME{key})形式が使用されていない場合、Oracle Web Cacheでは、次のエラー・メッセージがイベント・ログに記録されます。
[Date] [error 12086][ecid: request_id, serial_number]ESI syntax error. Unrecognized keywordkeywordis at lineline.
<esi:vars>タグは、HTMLコードの行内でネストしないでください。次に誤った構文の例を示します。
HTML code<esi:vars>$(VARIABLE_NAME{key})</esi:vars>HTML code
たとえば、次の例は無効です。
<IMG SRC="http://www.example.com/<esi:vars>$(HTTP_COOKIE{type})</esi:vars>/hello.gif"/>
次のESIマークアップには、挿入されたURLの一部として、Cookieのtypeとその値が含まれています。
<esi:vars>
<IMG SRC="http://www.example.com/$(HTTP_COOKIE{type})/hello.gif"/>
</esi:vars>
次のESI出力は、「ようこそ」ページへの<A HREF=...>リンクの一部としてlogindataを参照しています。logindataは、カスタム環境変数を含むXMLファイルを参照します。出力には、他の<A HREF=...>リンクの一部として、ユーザーのsessionIDおよびカテゴリtypeのCookie値も含まれています。
<esi:vars>
<A HREF="welcome.jsp?name=$(logindata{name})">
<A HREF="/shopping.jsp?sessionID=$(QUERY_STRING{sessionID})&type=$(QUERY_STRING{type})">
<IMG SRC="/img/shopping.gif">
</A>
<A HREF="/news.jsp?sessionID=$(QUERY_STRING{sessionID})&type=$(QUERY_STRING{type})">
<IMG SRC="/img/news.gif">
</A>
<A HREF="/sports.jsp?sessionID=$(QUERY_STRING{sessionID})&type=$(QUERY_STRING{type})">
<IMG SRC="/img/sports.gif">
</A>
<A HREF="/fun.jsp?sessionID=$(QUERY_STRING{sessionID})&type=$(QUERY_STRING{type})">
<IMG SRC="/img/fun.gif">
</A>
<A HREF="/about.jsp?sessionID=$(QUERY_STRING{sessionID})&type=$(QUERY_STRING{type})">
<IMG SRC="/img/about.gif">
</A>
</esi:vars>
<!--esi...--->タグにより、ESIタグでマークアップされているHTMLが、ESIタグを処理せずにブラウザに表示されます。このタグを使用したページが処理される際に、Oracle Web Cacheでは、開始の<!--esi要素と終了の-->要素を削除しながらページのコンテンツが処理されます。マークアップを処理できない場合は、このタグにより、ESIマークアップがHTMLの最終出力に影響しないことが保証されます。
In the following ESI markup, the <!--esi and --> are removed in the final
output. The output displays the content generated by <p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>,
plus any surrounding text.
<!--esi
<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>
-->
ESIマークアップを処理できない場合は、<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>がHTML出力に表示されます。