Url Rewrite Filter その9 URLパラメタの置換

あるURLパラメタが特定の条件を満たしたときに、そのパラメタを書き換えて、
書き換えた後のパラメタを持つURLにリダイレクトさせてやるとします。
例えば、検索キーワードが半角カナを含む場合に、半角カナの部分を全て全角カナに置換してやるとかです。


そういう場合はUrl Rewrite Filterの、condition要素で正規表現にマッチさせて、
必要な置換処理を行うメソッドを呼び出してやりましょう(下コードのrule1)。
condition要素のoperator・equalとnotequalはbodyの文字列との一致ではなく、
bodyの正規表現とのマッチです。
(というかたぶんjava.util.regex.Matcher#find()です。)

<!-- 半角ア〜半角ン以外にも半角カナはあるけど、今回は割愛 -->
<rule>
  <name>rule1</name>
  <condition type="parameter" name="param2" operator="equal">[ア-ン]</condition>
  <from>.*/(ActionA|ActionB|ActionC)\?.*</from>
  <run class="SomeClass" method="doSomeMethod" />
</rule>
<!-- doSomeMethodはparam2を書き換え、URLエンコードして、
     "rewrited_param2"という名前のattributeに設定する -->
<rule>
  <name>redirect_rule1</name>
  <condition type="attribute" name="rewrited_param2" operator="notequal">^$</condition>
  <from>.*/(ActionA|ActionB|ActionC)\?([0-9a-zA-Z.\-*_+%=&amp;]*)param2=[0-9a-zA-Z.\-*_+%]+(&amp;.*)?$</from>
  <to type="redirect">/$1?$2param2=%{attribute:rewrited_param2}$3</to>
</rule>

メソッドを実行して置換済みのパラメタをattributeに設定したら、
今度は該当のパラメタ以外は現状維持したまま、該当パラメタのみ差し替えて、
リダイレクトしましょう(上コードのredirect_rule1)。


パラメタの値はURLエンコードで使われる文字で構成されるとして、
こんな感じでやってやれば、param2が何番目のパラメタだろうと、
最初だろうと最後だろうと上手く置換できます。


なお、redirect_rule1のfromで記述した正規表現は本当は、↓です。

.*/(ActionA|ActionB|ActionC)\?([0-9a-zA-Z.\-*_+%=&]*)param2=[0-9a-zA-Z.\-*_+%]+(&.*)?$

xmlの要素のbodyでCDATAセクションではないので&は&amp;にエスケープしないといけません。
これを忘れると、Url Rewrite Filter自体起動できません。
なお、Javaソースコードではないので\を\\とエスケープしたりはしません。


CDATAセクションに正規表現を記述できたらよいなあと思いました。