2015年1月22日木曜日

Zend Frameworkのhtaccessの不思議(1)mod_rewriteの後方参照

Zend Frameworkを触っていて、htaccessにいくつか気になる点があったので調べた。
理解に至るまでにわりと頭がこんがらがったので数回に分けてメモ。

気になった記述は以下。
==============
【1行目】RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
【2行目】RewriteRule ^(.*) - [E=BASE:%1]
【3行目】RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
==============

まず 「$1」「%1」「\2」について。
これらはいずれも後方参照を指す。

$1 : RewriteRule内の正規表現における後方参照
%1 : RewriteCond内の正規表現における後方参照
\2 : インラインの後方参照
ということらしい。

【1行目】 RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
ここでの「\2」は、その直前の「(.+)」ということになるようだ。

【2行目】 RewriteRule ^(.*) - [E=BASE:%1]
ここでの「%1」は、1行目の「(/.+)」の部分に該当することになる。

では、【1行目】の「$1」は何を指すのだろうか?
htaccessのこの行以前に、RewriteRule内の正規表現に「()」で括られた箇所はないし、、、、?

ここで一度大きく詰まってしまって時間をかなり費やしたのだが、正解はmod_rewriteのURL書換における処理の順序にあるらしい。
mod_rewriteでは、RewriteCondに続けてRewriteRuleが記載されている場合、まずはじめにRewriteRuleを認識し、その後にRewriteCondの内容を確認してRuleの適用の可否を判断する。

そのため上記の場合は、
1. RewriteRule は ^(.*) - [E=BASE:%1] であると認識する
2. RewriteCondの内容 %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ に従って条件判定し、1.の適用の可否を判断
となるため、【1行目】の「$1」は、【2行目】RewriteRuleの「(.*)」に該当する。

「後方参照」というからには、てっきり「$1」よりも前の記述を参照しているものとばかり思っていたので、これは目からウロコだった。

てことは、要するにこの記述は一体なにをしているのか、、、というのが次回のメモとしよう。

・参考にさせてもらったページ
ずんWiki – mod_rewrite
stackoverflow - What does ::$1 mean in an htaccess?
stackoverflow - Backreferencing regex in apache


0 件のコメント: