doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

Apacheによる本文書き換え mod_substitute + mod_filter

スポンサーリンク

mod_substitute + mod_filter

環境

OS:Windows Server

Apache:2.4

mod_substitute

httpd.apache.org

概要

mod_substituteは、 response bodyに対して正規表現と固定文字列の両方の置換を実行するためのメカニズムを提供します。

用途

例えば、HTMLに記載されている内容を、HTMLの書き換えなしにApache側で書き換え(置換)可能です。

これにより、プロキシされたHTMLも書き換えて利用できます。

使い方

単純な例:

Substitute s/変換したい文字列/変換後の文字列/i n f q

  • i:大小文字区別なし
  • n:正規表現として扱わない(デフォルト正規表現として扱われる。)
  • f:デフォルト
  • q:パターンに変更が無い場合に速い

※コメントありがとうございます。n:正規表現と記載してしまっておりました。正しくは正規表現として扱わないです。

mod_filter

httpd.apache.org

概要

このモジュールは、出力コンテンツフィルタのスマートで状況依存の設定を可能にします。たとえば、コンテンツタイプが事前にわかっていない場合でも(たとえばプロキシで)、Apacheは異なるフィルタを介して異なるコンテンツタイプを処理するように設定できます。

用途

AddOutputFilterByTypeが非推奨となっているらしく、こちらに切替えて実装する必要がある。

実際の記述

<Location "/hoge/"> 
    FilterDeclare MYFILTER
    FilterProvider MYFILTER SUBSTITUTE "%{Content_Type} = 'text/html'"
    FilterChain MYFILTER
    Substitute "s/text.html/test.html/n" 
</Location> 

何をしているのか

  1. FilterDeclare ディレクティブでMYFILTER変数を宣言
  2. FilterProvider ディレクティブで使うフィルター、今回はSUBSTITUTEを呼び出します。
  3. FilterChain ディレクティブで宣言されたフィルターから実際のフィルターチェーンが構成されます。
  4. Substituteのルールとしては、レスポンスの「%{Content_Type} = 'text/html'」 text.html部分 を全て test.html に変更する