switch to a 60 bit hash
[httpd-crcsyncproxy.git] / docs / manual / howto / ssi.xml.ja
blobb765f2069cc23be5bc809f3d7118f7ceb0fc92b5
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.ja.xsl"?>
4 <!-- English Revision: 659902 -->
6 <!--
7 Licensed to the Apache Software Foundation (ASF) under one or more
8 contributor license agreements. See the NOTICE file distributed with
9 this work for additional information regarding copyright ownership.
10 The ASF licenses this file to You under the Apache License, Version 2.0
11 (the "License"); you may not use this file except in compliance with
12 the License. You may obtain a copy of the License at
14 http://www.apache.org/licenses/LICENSE-2.0
16 Unless required by applicable law or agreed to in writing, software
17 distributed under the License is distributed on an "AS IS" BASIS,
18 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 See the License for the specific language governing permissions and
20 limitations under the License.
21 -->
23 <manualpage metafile="ssi.xml.meta">
24 <parentdocument href="./">How-To / チュートリアル</parentdocument>
26 <title>Apache チュートリアル: Server Side Includes 入門</title>
28 <summary>
29 <p>サーバサイドインクルードによって、既存の HTML
30 ドキュメントに動的なコンテンツを追加することができます。</p>
31 </summary>
33 <section id="related"><title>はじめに</title>
34 <related>
35 <modulelist>
36 <module>mod_include</module>
37 <module>mod_cgi</module>
38 <module>mod_expires</module>
39 </modulelist>
41 <directivelist>
42 <directive module="core">Options</directive>
43 <directive module="mod_include">XBitHack</directive>
44 <directive module="mod_mime">AddType</directive>
45 <directive module="core">SetOutputFilter</directive>
46 <directive module="mod_setenvif">BrowserMatchNoCase</directive>
47 </directivelist>
48 </related>
50 <p>この記事は、通常は単に SSI と呼ばれる Server Side Includes
51 を扱います。この記事においては、サーバでの SSI を許可するための設定と、
52 現在の HTML ページに動的なコンテンツを加えるためのいくつかの基本的な
53 SSI 技術を紹介します。</p>
55 <p>記事の後半では、SSI ディレクティブで SSI
56 と共に実行することができる条件文のような
57 幾分高度な事柄について述べています。</p>
59 </section>
61 <section id="what"><title>SSI とは ?</title>
63 <p>SSI (Server Side Includes) は、HTML
64 ページ中に配置されるディレクティブであり、
65 サーバでページを提供する時に評価されます。SSI は、CGI
66 プログラムやその他の動的な技術で全てのページを提供せずに、
67 動的に生成されたコンテンツを現在の HTML ページに加えます。</p>
69 <p>どういう場合に SSI を使い、どういう場合にプログラムで
70 ページを完全に生成するかは、ページのうちどの程度が静的であり、
71 ページが提供されるたびに再計算する必要がどの程度あるかで通常は決定します。
72 SSI は現在時刻のような小さい情報を加えるにはうってつけの方法です。
73 しかし、そのページのほとんどの部分が提供時に生成される場合は、
74 他の方法を探す必要があります。</p>
75 </section>
77 <section id="configuring">
78 <title>SSI を許可するためのサーバの設定</title>
80 <p>サーバで SSI を許可するには、<code>httpd.conf</code>
81 ファイルまたは <code>.htaccess</code>
82 ファイルに次のディレクティブを指定する必要があります:</p>
83 <example>
84 Options +Includes
85 </example>
87 <p>この指定は、ファイルを SSI
88 ディレクティブで解析させることを許可するということを Apache
89 に伝えます。ほとんどの設定ではお互いを上書きできる、複数の
90 <directive module="core">Options</directive> があることに
91 注意してください。おそらく、設定が最後に評価されることを
92 保証されるために、SSI を使用したいディレクトリに <code>Options</code>
93 ディレクティブを適用する必要があるでしょう。</p>
95 <p>全てのファイルが SSI
96 ディレクティブで解析されるというわけではありません。
97 どのファイルが解析されるかを Apache に伝える必要があります。
98 これを行なうには二つ方法があります。
99 次のディレクティブを使うことで、例えば <code>.shtml</code>
100 のような特別なファイル拡張子を持つファイルを解析するよう
101 Apache に伝えることができます:</p>
102 <example>
103 AddType text/html .shtml<br />
104 AddOutputFilter INCLUDES .shtml
105 </example>
107 <p>この方法の欠点は、もし現在のページに SSI ディレクティブを加えたい場合、
108 それらのディレクティブが実行されるように
109 <code>.shtml</code> 拡張子にするため、そのページの名前と、
110 そのページへの全てのリンクを変更しなければならないことです。</p>
112 <p>もう一つの方法は、<directive module="mod_include">XBitHack</directive>
113 ディレクティブを使用することです:</p>
114 <example>
115 XBitHack on
116 </example>
118 <p><directive module="mod_include">XBitHack</directive>
119 は、ファイルの実行ビットが立っている場合、
120 SSI ディレクティブにより解析することを Apache に伝えます。
121 従って、SSI ディレクティブを現在のページに加えるためには、
122 ファイル名を変更しなくてもよく、単に <code>chmod</code>
123 を使用してファイルを実行可能にするだけで済みます。</p>
124 <example>
125 chmod +x pagename.html
126 </example>
128 <p>行なうべきではないことに関する短いコメント。時々誰かが、全ての
129 <code>.html</code> ファイルを SSI で解析するよう Apache に伝えれば、
130 わざわざ <code>.shtml</code> というファイル名にする必要がないといって
131 薦めるのを見ることでしょう。こういう人たちは、おそらく
132 <directive module="mod_include">XBitHack</directive>
133 について聞いたことがないのでしょう。
134 この方法について注意することは、たとえ SSI
135 ディレクティブを全く含まない場合でも、Apache がクライアントに
136 送る全てのファイルを最後まで読み込ませることになります。
137 この方法はかなり処理を遅くするものであり、良くないアイデアです。</p>
139 <p>もちろん、Windows ではそのような実行ビットをセット
140 するようなものはありませんのでオプションが少し制限されています。</p>
142 <p>デフォルトの設定では、Apache は SSI ページについて最終変更時刻や
143 コンテンツの長さを HTTP ヘッダに送りません。
144 動的なコンテンツであるため、それらの値を計算するのが難しいからです。
145 このためドキュメントがキャッシュされなくなり、
146 結果としてクライアントの性能が遅くなったように感じさせることになります。
147 これを解決する方法が二つあります:</p>
149 <ol>
150 <li><code>XBitHack Full</code> 設定を使用する。
151 この設定により、もともと要求されたファイルの時刻を参照し、
152 読み込まれるファイルの変更時刻を無視して最終変更時刻を決定するよう
153 Apache に伝えます。</li>
155 <li><a href="../mod/mod_expires.html">mod_expires</a>
156 で提供されているディレクティブを使用して、
157 ファイルが無効になる時刻を明示します。これにより、
158 ブラウザとプロキシにキャッシュが有効であることを通知します。</li>
159 </ol>
160 </section>
162 <section id="basic"><title>基本的な SSI ディレクティブ</title>
164 <p>SSI ディレクティブは以下の文法で記述します:</p>
165 <example>
166 &lt;!--#element attribute=value attribute=value ... --&gt;
167 </example>
169 <p>HTML のコメントのような書式をしているので、もし SSI
170 を正しく動作可能にしなければ、ブラウザはそれを無視するでしょう。
171 しかし、HTML ソース中では見えます。もし SSI を正しく設定したなら、
172 ディレクティブはその結果と置き換えられます。</p>
174 <p>element はたくさんあるものから一つ指定することができます。
175 指定できるものの大多数については、次回もう少し詳しく説明します。
176 ここでは、SSI で行なうことができる例をいくつか示します。</p>
178 <section id="todaysdate"><title>今日の日付</title>
180 <example>
181 &lt;!--#echo var="DATE_LOCAL" --&gt;
182 </example>
184 <p><code>echo</code> 要素は単に変数の値を出力します。
185 CGI プログラムに利用可能な環境変数の全ての
186 セットを含む多くの標準変数があります。また、<code>set</code>
187 要素を用いることで、独自の変数を定義することができます。
188 </p>
190 <p>出力される日付の書式が好きではない場合、その書式を修正するために、
191 <code>config</code> 要素に <code>timefmt</code>
192 属性を使用することができます。</p>
194 <example>
195 &lt;!--#config timefmt="%A %B %d, %Y" --&gt;<br />
196 Today is &lt;!--#echo var="DATE_LOCAL" --&gt;
197 </example>
198 </section>
200 <section id="lastmodified"><title>ファイルの変更日</title>
202 <example>
203 This document last modified &lt;!--#flastmod file="index.html" --&gt;
204 </example>
206 <p>この要素も <code>timefmt</code>
207 フォーマットの設定に従います。</p>
208 </section>
210 <section id="cgi"><title>CGI プログラムの結果を取り込む</title>
212 <p>これは、全ての人のお気に入りである ``ヒットカウンタ'' のような
213 CGI プログラムの結果を出力する SSI
214 のより一般的な使用のうちの一つです。</p>
216 <example>
217 &lt;!--#include virtual="/cgi-bin/counter.pl" --&gt;
218 </example>
220 </section>
221 </section>
223 <section id="additionalexamples">
224 <title>追加の例</title>
226 <p>以下は、SSI を使用して HTML
227 ドキュメントにおいてできることのいくつかの特別な例です。</p>
229 <section id="docmodified"><title>いつこのドキュメントは修正されたのか
230 ?</title>
232 <p>先に、ドキュメントが最後に変更されたのはいつかを
233 ユーザに通知するために SSI を使用することができることを述べました。
234 しかしながら、実際の方法は、いくぶん問題のままにしておきました。
235 HTML ドキュメントに配置された次のコードは、ページにそのような
236 タイムスタンプを入れるでしょう。もちろん、上述のように、
237 SSI を正しく動作可能にしておく必要があります。</p>
238 <example>
239 &lt;!--#config timefmt="%A %B %d, %Y" --&gt;<br />
240 This file last modified &lt;!--#flastmod file="ssi.shtml" --&gt;
241 </example>
243 <p>もちろん、<code>ssi.shtml</code>
244 の部分を実際の当該ファイル名と置き換える必要があります。
245 もし、あらゆるファイルに張ることができる一般的なコードを探しているなら、
246 これは不便であるかもしれません。おそらくその場合は、
247 そうする代わりに変数 <code>LAST_MODIFIED</code>
248 を使用したいと考えるでしょう:</p>
249 <example>
250 &lt;!--#config timefmt="%D" --&gt;<br />
251 This file last modified &lt;!--#echo var="LAST_MODIFIED" --&gt;
252 </example>
254 <p><code>timefmt</code>
255 書式についてのより詳細については、お好みの検索サイトに行き、
256 <code>strftime</code> で検索してみてください。文法は同じです。</p>
257 </section>
259 <section id="standard-footer">
260 <title>標準のフッタを挿入する</title>
262 <p>もし数ページを超えるページを持つサイトを管理しているならば、
263 全ページに対して変項を行なうことが本当に苦痛となり得ることが
264 分かるでしょう。全てのページに渡ってある種の標準的な外観を
265 維持しようとしているならば特にそうでしょう。</p>
267 <p>ヘッダやフッタ用の挿入用ファイルを使用することで、
268 このような更新にかかる負担を減らすことができます。
269 一つのフッタファイルを作成し、それを <code>include</code>
270 SSI コマンドで各ページに入れるだけで済みます。<code>include</code>
271 要素は、<code>file</code> 属性または <code>virtual</code>
272 属性のいずれかを使用してどのファイルを挿入するかを決めることができます。
273 <code>file</code> 属性は、<em>カレントディレクトリからの相対パスで示された
274 </em>ファイルパスです。
275 それは / で始まる絶対ファイルパスにはできず、また、そのパスの一部に ../
276 を含むことができないことを意味します。<code>virtual</code>
277 属性は、おそらくより便利だと思いますが、提供するドキュメントからの相対
278 URL で指定すべきです。それは / で始めることができますが、
279 提供するファイルと同じサーバ上に存在しなくてはなりません。</p>
280 <example>
281 &lt;!--#include virtual="/footer.html" --&gt;
282 </example>
284 <p>私は最後の二つを組み合わせて、<code>LAST_MODIFIED</code>
285 ディレクティブをフッタファイルの中に置くことがよくあります。
286 SSI ディレクティブは、挿入用のファイルに含ませたり、
287 挿入ファイルのネストをしたりすることができます。すなわち、
288 挿入用のファイルは他のファイルを再帰的に挿入することができます。</p>
289 </section>
291 </section>
293 <section id="config">
294 <title>他に何が設定できるのか ?</title>
296 <p>時刻書式を <code>config</code> で設定できることに加えて、
297 更に二つ <code>config</code> で設定することができます。</p>
299 <p>通常、SSI ディレクティブで何かがうまくいかないときは、
300 次のメッセージが出力されます。</p>
301 <example>
302 [an error occurred while processing this directive]
303 </example>
305 <p>このメッセージを他のものにしたい場合、<code>config</code>
306 要素の <code>errmsg</code> 属性で変更することができます:</p>
307 <example>
308 &lt;!--#config errmsg="[It appears that you don't know how to use SSI]" --&gt;
309 </example>
311 <p>おそらく、エンドユーザはこのメッセージを決して見ることはありません。
312 なぜなら、そのサイトが生きた状態になる前に SSI ディレクティブに関する
313 全ての問題を解決しているはずだからです。(そうですよね?)</p>
315 <p>そして、<code>config</code> において <code>sizefmt</code>
316 属性を使用することで、
317 返されるファイルサイズの書式を設定することができます。
318 バイト数には <code>bytes</code> を、適当に Kb や Mb
319 に短縮させるには <code>abbrev</code> を指定することができます。</p>
320 </section>
322 <section id="exec">
323 <title>コマンドの実行</title>
325 <p>今後数ヶ月のうちに、小さな CGI プログラムと SSI
326 を使用する記事を出したいと考えています。ここではそれとは別に、
327 <code>exec</code> 要素によって行なうことができることを示します。
328 SSI にシェル (正確には <code>/bin/sh</code>。Win32 ならば DOS シェル)
329 を使用してコマンドを実行させることができます。
330 下記の例では、ディレクトリリスト出力を行ないます。</p>
331 <example>
332 &lt;pre&gt;<br />
333 &lt;!--#exec cmd="ls" --&gt;<br />
334 &lt;/pre&gt;
335 </example>
337 <p>Windows 上では、</p>
338 <example>
339 &lt;pre&gt;<br />
340 &lt;!--#exec cmd="dir" --&gt;<br />
341 &lt;/pre&gt;
342 </example>
344 <p>Windows 上では、このディレクティブによっていくつかの奇妙な
345 書式に気づくでしょう。なぜなら <code>dir</code> の出力が文字列
346 ``&lt;<code>dir</code>&gt;'' を含み、ブラウザを混乱させるからです。</p>
348 <p>この機能は非常に危険であり、どんなコードでも <code>exec</code>
349 タグに埋め込まれてしまえば実行することに注意してください。例えば
350 `` ゲストブック '' のように、もし、
351 ユーザがページの内容を編集できる状況にあるならば、
352 この機能を確実に抑制してください。<code>Options</code>
353 ディレクティブの <code>IncludesNOEXEC</code> 引数を指定することで、
354 SSI は許可するけれど <code>exec</code>
355 機能は許可しないようにすることができます。</p>
356 </section>
358 <section id="advanced">
359 <title>高度な SSI テクニック</title>
361 <p>コンテンツを出力することに加え、Apache SSI は変数を設定し、
362 そして比較と条件分岐にその変数を使用できる機能を提供しています。
363 </p>
365 <section id="caveat"><title>警告</title>
367 <p>この記事で述べた大部分の機能は、Apache 1.2
368 以降を使用している場合のみ利用可能です。もちろん、もし Apache 1.2
369 以降を使用してない場合、直ちにアップグレードする必要があります。
370 さぁ、今それを行ないなさい。それまで待っています。</p>
371 </section>
373 <section id="variables"><title>変数を設定する</title>
375 <p><code>set</code> ディレクティブを使用して、
376 後で使用するために変数を設定することができます。
377 これは後の説明で必要になるので、ここでそれについて述べています。
378 文法は以下のとおりです:</p>
379 <example>
380 &lt;!--#set var="name" value="Rich" --&gt;
381 </example>
383 <p>このように単純に文字どおりに設定することに加え、
384 <a href="../env.html">環境変数</a>や上記の変数
385 (例えば <code>LAST_MODIFIED</code> のような)
386 を含む他のあらゆる変数を値を設定するのに使用することができます。
387 変数名の前にドル記号 ($) を使用することで、
388 それがリテラル文字列ではなくて変数であることを示します。</p>
389 <example>
390 &lt;!--#set var="modified" value="$LAST_MODIFIED" --&gt;
391 </example>
393 <p>ドル記号 ($) を文字として変数の値に入れるには、
394 バックスラッシュによってドル記号をエスケープする必要があります。</p>
395 <example>
396 &lt;!--#set var="cost" value="\$100" --&gt;
397 </example>
399 <p>最後になりますが、長い文字列の中に変数を置きたい場合で、
400 変数名が他の文字とぶつかる可能性があり、
401 それらの文字について混乱してしまう場合、この混乱を取り除くため、
402 変数名を中括弧で囲むことができます
403 (これについての良い例を示すのは難しいのですが、
404 おそらく分かっていただけるでしょう)。
405 </p>
406 <example>
407 &lt;!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --&gt;
408 </example>
409 </section>
411 <section id="conditional">
412 <title>条件式</title>
414 <p>さて、変数を持っていて、
415 それらの値を設定して比較することができるのですから、
416 条件を表すためにそれらを使用することができます。これにより
417 SSI はある種の小さなプログラミング言語になっています。
418 <module>mod_include</module> は条件を表現するために <code>if</code>,
419 <code>elif</code>, <code>else</code>, <code>endif</code>
420 構造を提供しています。これによって、
421 一つの実際のページから複数の論理ページを効果的に生成することができます。</p>
423 <p>条件構造は以下のとおりです:</p>
424 <example>
425 &lt;!--#if expr="test_condition" --&gt;<br />
426 &lt;!--#elif expr="test_condition" --&gt;<br />
427 &lt;!--#else --&gt;<br />
428 &lt;!--#endif --&gt;
429 </example>
431 <p><em>test_condition</em>
432 はあらゆる種類の論理的比較をすることができます。
433 値を比較したり、その値が ``真'' かどうかを評価します
434 (空でないなら与えられた文字列は真です)。
435 利用可能な比較演算子の全てのリストについては、
436 <module>mod_include</module> ドキュメンテーションを参照してください。
437 ここでは、この構造をどう使用するかの例をいくつか示します。</p>
439 <p>設定ファイルで次の行を記述します:</p>
440 <example>
441 BrowserMatchNoCase macintosh Mac<br />
442 BrowserMatchNoCase MSIE InternetExplorer
443 </example>
445 <p>これはクライアントが Macintosh
446 上でインターネットエクスプローラが動いている場合、環境変数
447 ``Mac'' と ``InternetExplorer'' を真と設定します。</p>
449 <p>次に、SSI が可能になったドキュメントで以下を行ないます:
450 </p>
451 <example>
452 &lt;!--#if expr="${Mac} &amp;&amp; ${InternetExplorer}" --&gt;<br />
453 Apologetic text goes here<br />
454 &lt;!--#else --&gt;<br />
455 Cool JavaScript code goes here<br />
456 &lt;!--#endif --&gt;
457 </example>
459 <p>Mac 上の IE に対して何か思うところがあるわけでありません。
460 他では実行できているいくつかの JavaScript を Mac 上の IE
461 で実行させるのに、先週数時間苦労したというだけのことです。
462 上の例はその暫定的な対処方法です。</p>
464 <p>他のどんな変数 (あなたが定義するもの、
465 または普通の環境変数のいずれか) も、条件文に使用することができます。
466 Apache は <code>SetEnvIf</code> ディレクティブや他の関連
467 ディレクティブを使用して環境変数を設定することができます。
468 この機能により、CGI
469 に頼ることなくかなり複雑な動的なことをさせることができます。</p>
470 </section>
471 </section>
473 <section id="conclusion"><title>終わりに</title>
475 <p>SSI は確かに CGI
476 や動的なウェブページを生成する他の技術に代わるものではありません。
477 しかし、たくさんの余分な作業をせずに、
478 少量の動的なコンテンツを加えるにはすぐれた方法です。</p>
479 </section>
481 </manualpage>