Apache の 〜内でのRewriteバックリファレンス

時間指定でRewriteルールを変更するオーダ。Rewriteルールを書いた設定ファイルが2つあって、時間でそれを切り替える。
Ifで時間を指定して、Includeを切り替える。こんなふうに書いてみました。

<If "%{TIME} < 20181214123000" >
    Include conf/AAA.conf
</If>
<Else>
    Include conf/BBB.conf
</Else>

それぞれの設定ファイルにはRewriteルールが30行づつくらい入っている。
ところが試験してみるとなんだかちゃんとワークしない。最初、IfがちゃんとFalse/Trueを判定していないのかと思っていたんですが、if,elseのブロックを単純なものに置き換えたところ、しっかりと判定してくれるのでそこではないみたい。

行数かな

現在の時点では AAA.conf が読まれるはず。それはちゃんと読んでいるんですが、最初の2つのルール(RewriteCondを入れると10行くらい)しか有効になっていない。
後ろの20行のルールがワークしていない。30行程度でダメとかないよなぁと思い、最初の10行を消して後ろのルールだけにしてみてもNG。

Ifブロックのせい?

どうもIfブロック中にRewriteがあると意図した動作をしない。試しにIf〜elseブロックをコメントアウトすると動作する。

#<If "%{TIME} < 20181214123000" >
    Include conf/AAA.conf
#</If>
#<Else>
#   Include conf/BBB.conf
#</Else>

どうもIfブロック中にあるとダメみたい。

動作する部分としない部分の差は

なんだと見てみる。
すると、RewriteRule時に文字列置き換えに%1,%2をつかっているところは正常に動作し、$1,$2をつかっているところは動作しない、というかRewriteしてくれない。
ダラーがダメなのか。

Ifブロックというよりも

たぶん、Ifの問題じゃなくて、Apahceのexpressionでのbackreferenceと、mod_rewriteでのbackreferenceの表現がかぶっているからじゃないかと思う。
http://httpd.apache.org/docs/2.4/en/expr.html 
ここにexpression中のbackreferenceについての説明がある。Ifブロック中だと、expressionが有効になって別のbackreference機構が優先されるんでしょう。

じゃあどうしよう

仕方がないので%1,%2で全部書き換え。バグというか、屋上屋を重ねた拡張がなせる業という感じがしますね。