9

symfony2 フレームワークのソースを閲覧してきました。サンプル Web サイトの htaccess ファイルで、%{REQUEST_URI}::$1次のように記述されていることがわかりました。

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

そのルールの上のコメントは説明します

以下は、他のすべてのクエリをフロントコントローラーに書き換えます。この条件により、大量の仮想ホスティングを行うために Apache エイリアスを使用している場合、app.php ファイルを適切に解決できるようにベース パスが先頭に追加されます。エイリアスのない環境でも機能し、安全で万能なソリューションを提供します。

::$1ただし、それはorを説明していません::\2

それらは後方参照ですか?そうでない場合、それらは何ですか? 彼らの目的は何ですか?

4

2 に答える 2

17

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

$1htaccess コンテキスト [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/する環境変数に格納されます。はである最初に一致した文字列を参照します。BASERewriteRule%1RewriteCond/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/myactionycontroller/myactionmycontroller/myaction

その結果、最初のRewriteRuleものは使用されません。環境変数は設定されず、2 番目のBASERewriteRule がそれを使用すると、単に空になります。

参考文献

[1] http://httpd.apache.org/docs/current/mod/mod_rewrite.html

于 2013-09-03T09:49:22.163 に答える