<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.ja.xsl"?>
<!-- English Revision: 421100 -->

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<manualpage metafile="filter.xml.meta">

  <title>フィルタ</title>

  <summary>
    <p>Apache でのフィルタの使い方について記述しています。</p>
  </summary>

  <section id="intro">
    <title>Apache 2 のフィルタ</title>
    <related>
      <modulelist>
        <module>mod_filter</module>
        <module>mod_deflate</module>
        <module>mod_ext_filter</module>
        <module>mod_include</module>
        <module>mod_charset_lite</module>
      </modulelist>
      <directivelist>
        <directive module="mod_filter">FilterChain</directive>
        <directive module="mod_filter">FilterDeclare</directive>
        <directive module="mod_filter">FilterProtocol</directive>
        <directive module="mod_filter">FilterProvider</directive>
        <directive module="mod_mime">AddInputFilter</directive>
        <directive module="mod_mime">AddOutputFilter</directive>
        <directive module="mod_mime">RemoveInputFilter</directive>
        <directive module="mod_mime">RemoveOutputFilter</directive>
        <directive module="mod_ext_filter">ExtFilterDefine</directive>
        <directive module="mod_ext_filter">ExtFilterOptions</directive>
        <directive module="core">SetInputFilter</directive>
        <directive module="core">SetOutputFilter</directive>
      </directivelist>
    </related>

<p>Apache 2.0 以降ではフィルタチェイン機能が使え、データが
どこから来るかに関わらず、非常に柔軟で調整しやすい方法で
入出力データを処理できます。
入力データをプリプロセスしたり出力データをポストプロセスしたりできます。
この処理は、これまでのリクエスト処理フェーズとは根本的に独立した
処理になります。</p>
<p class="figure">
<img src="images/filter_arch.png" width="569" height="392" alt=
"Filters can be chained, in a Data Axis orthogonal to request processing"
/>
</p>
<p>Apache の標準的なディストリビューションでのフィルタ例は :</p>
<ul>
<li><module>mod_include</module> で、サーバサイドインクルード SSI を実装しています</li>
<li><module>mod_ssl</module> で、SSL 暗号化 (https) を実装しています。</li>
<li><module>mod_deflate</module> で、on-the-fly のデータ圧縮・展開機能を実装しています。</li>
<li><module>mod_charset_lite</module> で、異なる文字セット間の変換を実装しています。</li>
<li><module>mod_ext_filter</module> で、外部プログラムをフィルタとして実行します。</li>
</ul>
<p>チャンキングやバイトレンジ処理といった処理を行うために
Apache は、内部的にいくつかのフィルタを使っています。</p>

<p>様々なアプリケーションがサードパーティ製のフィルタモジュールとして
実装されていて、<a
href="http://modules.apache.org/">modules.apache.org</a>
などから取得できます。たとえば :</p>

<ul>
<li>HTML や XML の処理と書き換え</li>
<li>XSLT 変換と XIncludes</li>
<li>XML 名前空間のサポート</li>
<li>ファイルアップロード処理や HTML フォームのデコード</li>
<li>画像処理</li>
<li>PHP スクリプトなどのアプリケーションに対する保護機能</li>
<li>テキストの検索置換・編集機能</li>
</ul>
</section>

<section id="smart">
<title>スマートフィルタ</title>
<p class="figure">
<img src="images/mod_filter_new.png" width="423" height="331"
alt="Smart filtering applies different filter providers according to the state of request processing"/>
</p>
<p>Apache 2.1 移行に含まれる <module>mod_filter</module> では、
実行時に動的にフィルタチェインを有効にできます。
ですからたとえば、HTML を HTML フィルタで、JPEG 画像をそれとは
全く別のフィルタで、書き換えるようなプロクシを設定することもできます。
その上、そのプロクシはどのオリジンサーバがコンテンツを送信するか
事前情報無しでいいように構成できます。
これは、実行時に実際のコンテンツに応じて別々のフィルタプロバイダに
ディスパッチするフィルタハーネスを使うことで実現されています。
チェインの中に直接入れて無条件に適用したり、動的にプロバイダとして
適用するようにしたりすることは、どんなフィルタでもできます。
たとえば、</p>
<ul>
<li>HTML 処理フィルタはコンテントが text/html あるいは
application/xhtml+xml の場合にのみ実行されます</li>
<li>圧縮フィルタは圧縮可能な入力で、非圧縮状態のものに
対してのみ実行されます</li>
<li>文字セット変換フィルタはテキスト文書が
希望の文字セットになっていない場合に挿入されます</li>
</ul>
</section>

<section id="using">
<title>フィルタの使い方</title>
<p>フィルタの使い方には二つの方法があります: シンプルとダイナミック。
一般的にはどちらかのみを使ったほうがよいでしょう。
これらを組み合わせて使用すると、予期しない結果になるかもしれません。
(とはいえ、シンプルな入力フィルタとシンプルあるいはダイナミックな
出力フィルタを組み合わせることは自由に出来ます。)</p>
<p>シンプルな方法は、入力フィルタのみを設定し、必要に応じて
静的なフィルタチェインを出力フィルタとして設定する方法です。
関連するディレクティブは、
    <directive module="core">SetInputFilter</directive>,
    <directive module="core">SetOutputFilter</directive>,
    <directive module="core">AddInputFilter</directive>,
    <directive module="core">AddOutputFilter</directive>,
    <directive module="mod_mime">RemoveInputFilter</directive>,
    <directive module="mod_mime">RemoveOutputFilter</directive>
    になります。</p>

<p>ダイナミックな方法は、静的なものとフレキシブルなものを両方有効にする
方法で、<module>mod_filter</module> のページで述べられています。
関連するディレクティブは、
    <directive module="mod_filter">FilterChain</directive>,
    <directive module="mod_filter">FilterDeclare</directive>, 
    <directive module="mod_filter">FilterProvider</directive>
    になります。</p>

<p>ディレクティブ <directive module="core">AddOutputFilterByType</directive>
はまだサポートされていますが、種々の問題をはらんでおり、非推奨です。
ダイナミックな設定方法を代わりに使ってください。</p>

  </section>
</manualpage>
