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で全部書き換え。バグというか、屋上屋を重ねた拡張がなせる業という感じがしますね。