Zend プロジェクトでほぼ同じ htaccess ファイルに遭遇しました。
htaccess ファイル (Zend プロジェクト ディレクトリにあり、index.php と同じ) は次のように述べています。
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
Zend がhttp://mydomain.tld/zend (後で yourdomain と呼びましょう) にインストールされているとします。yourdomain/mycontroller/myaction
したがって%{REQUEST_URI}
となります/zend/mycontroller/myaction
。
$1
htaccess コンテキスト [1]のディレクティブのパターンである はRewriteRule
、サーバーを現在の状態に導いたプレフィックスを削除した後、最初にファイルシステム パスと照合されることに注意してくださいRewriteRule
(たとえばapp1/index.html
、またはindex.html
ディレクティブが定義されている場所によって異なります)。 "。
したがって$1
となりますmycontroller/myaction
。
と%{REQUEST_URI}::$1
なります/zend/mycontroller/myaction::mycontroller/myaction
。
上記の文字列は に対して照合されます^(/.+)(.+)::\2$
。丸括弧内の 2 つのキャプチャ グループについては、つまり、多くの組み合わせが一致する(/.+)(.+)
前に注意してください。::
例えば:
グループ 1:/z
グループ 2:end/mycontroller/myaction
また
グループ 1:/zend/mycontroller/myactio
グループ 2:n
そしてその間にあるものはすべて有効な一致です。実際、最も興味深いのは
グループ 1:/zend/
グループ 2:mycontroller/myaction
\2
これは、2 番目のグループへの後方参照( の後::
) を一致させる唯一のケースです。
この場合、最初に実行/zend/
する環境変数に格納されます。はである最初に一致した文字列を参照します。BASE
RewriteRule
%1
RewriteCond
/zend/
2 番目の を見ると、RewriteRule
なぜこれが必要なのかは明らかです。index.php
でしか見られないので、の前/zend/index.php
に追加する必要があります。/zend/
index.php
RewriteRule
ここでは、2 番目のディレクティブの置換として URL パスを使用することを想定しています。[1] を参照し、RewriteRule ディレクティブ セクションで「提供されるリソースへの DocumentRoot 相対パス」を検索します。
上記のすべては、クエリ文字列を変更しない/変更しないままにします。index.php
クエリ文字列 (および URI) を解析する方法次第です。
最後に、Zend がドメイン ルートにインストールされている場合について説明します。
%{REQUEST_URI}
となります/mycontroller/myaction
。
$1
となりますmycontroller/myaction
。
RewriteCond で照合する文字列は になります/mycontroller/myaction::mycontroller/myaction
。
今回は、最初のグループの最初のバックスラッシュの後に少なくとも 1 つの文字が続く必要があるため、2 番目のグループ(/.+)(.+)
は決して一致しません。mycontroller/myaction
ycontroller/myaction
mycontroller/myaction
その結果、最初のRewriteRule
ものは使用されません。環境変数は設定されず、2 番目のBASE
RewriteRule がそれを使用すると、単に空になります。
参考文献
[1] http://httpd.apache.org/docs/current/mod/mod_rewrite.html