6

次の点を考慮してください。

RewriteRule ^(.*)$ index.php/$1

私が持っている mod_rewrite に関する初歩的な知識に基づいて、これは と の間の URL 部分全体と一致し、example.com/その?query=string前に を追加する必要index.php/があります。

http://example.com/some/stuff -> http://example.com/index.php/some/stuff

ここで、次のことを考慮してください。

RewriteRule . index.php

Concrete5 CMS の現在のアップデートの開発者によると、これはまったく同じことを行います。実際、私のサーバーでもそれを行っているようです。

私の質問は、なぜ 2 番目の RewriteRule が次のような結果ではなく同じ結果をもたらすのかということです。

http://example.com/some/stuff -> http://example.com/index.phpome/stuff

.1文字に一致してから文字列に置き換えるべきではありませんindex.phpか? これは Apache 2.2 上にあります。

4

2 に答える 2

1

RewriteRule ^(.*)$ index.php/$1キャプチャされたテキストを照合して使用し、最初に要求されたものを最後に追加して新しいパスを作成します$1

RewriteRule . index.phpアンカーされていない正規表現であるため、一致します。以前の正規表現はとを使用^$て一致を固定します。これは、パターンが完全に一致する必要があることを意味しますが、この正規表現は一致しないため、文字列内の任意の場所で一致するため、任意の文字列が一致します。mod_rewriteは各テストを実行中の述語として扱うため、このルールは一致する限り適用されます。

ルールが一致すると、置換が行われます。置換は完全な置換であるため、このように後方参照を使用しない$1と、元のパターンにあったものはすべて失われます。この場合、新しいパスは。になりindex.phpます。

したがって、2つにはわずかな違いがあり、2つ目は、最初に要求されたパスを最後に追加せずに、index.phpに直接移動します。ほとんどの場合、Concrete5 CMSは、リクエストから直接取得した情報に従ってディスパッチするフロントコントローラーを使用しています。これはリダイレクトの書き換えではないため、元のリクエストは保持され、代わりに使用されます。つまり、一部の責任をApacheからアプリケーションコードの手に移し、ホスティング環境への依存を減らします。

于 2012-09-30T02:23:39.620 に答える
0

左側の一致は置換されず、単に検索されます。特定の部分を置換/保持するには、後方参照を使用する必要があります。

于 2012-09-30T02:11:08.643 に答える