0

すべてのリクエストパスを開始ファイルに書き直そうとしています。そのようです:

RewriteRule .* framework/init.php

ただし、このフレームワーク内には、PHPによる処理を要求せずにファイルを提供できるディレクトリがいくつかあります。ただし、これらのディレクトリへの実際のパスは使用したくありません。これらのパスをPHPルーターで解釈できるようにするためです。したがって、これらのディレクトリのエイリアスが必要です。例えば:

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

問題は、これらの書き換えルールの両方が個別に機能することですが、それらを組み合わせようとすると、問題が発生します。エイリアスの書き換えが発生した後、.htaccess全体を再評価しているようです。これが私が試したことのいくつかの例です:

特定の条件下で書き換え-すべての行をスキップする:

rewriteRule ^i - [S=1]
RewriteRule .* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

動作しません。2行目がスキップされたように見え、3行目が2行目がスキップされない状態に書き換えられるため、2行目が実行されます。


排他的な書き換えの使用-すべての行:

RewriteRule (?!i).* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

同じ話。


例外行の後で書き換えエンジンを停止します。

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2 [L]
RewriteRule .* framework/init.php

動作していません。


書き換え条件の追加:

RewriteCond %{REQUEST_URI} ^(?!i)
RewriteRule .* framework/init.php
RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2

上記の例はすべて、2つのRewriteRuleのいずれかを削除すると機能し始めることに注意してください。私は同様の質問を探しましたが、それらはすべて私が適用しようとした解決策を持っています。彼らの質問と私の質問の違いの1つは、「特別な」ディレクトリを、通常要求されたときにinit.phpに書き換えられるディレクトリに書き直したいということです。誰かがこれが可能かどうか教えてもらえますか?もしそうなら、私が欠けているものや得ていないものは何ですか?

4

2 に答える 2

0

いくつかの調査を行った後、私は、書き換えエンジンが実際にinが書き換えられた後にパスを再評価することを発見しました。

書き換えられた要求が処理されるときに、.htaccessファイルまたはセクションが再度検出される可能性があります。そのため、ルールセットが最初から再実行される可能性があります。最も一般的には、これは、ルールの1つがリダイレクト(内部または外部)を引き起こし、要求プロセスを最初からやり直す場合に発生します。

そして、リライトエンジンを完全に停止するには、[END]フラグを使用する必要があります。

代替フラグ[END]を使用して、現在の書き換え処理を終了するだけでなく、ディレクトリごと(htaccess)のコンテキストで後続の書き換え処理が発生しないようにすることができます。これは、外部リダイレクトから生じる新しいリクエストには適用されません。

ただし、この[END]フラグは、Apache2.4以降の新しいフラグです。

mod_rewriteは、RewriteRuleの[QSD](クエリ文字列破棄)フラグと[END]フラグを追加して、一般的な書き換えシナリオを簡素化します。

したがって、結論は次のとおりです。私が持っていないApache 2.4を持っていない限り、それを行うことはできません。

編集:誰かがそれを行う「古い」方法を知っているときのために、私はこの答えを「未定」のままにしておきます。

于 2012-05-02T15:17:34.530 に答える
0

今日、解決策を見つけました。^i-rule が一致したときに環境変数を設定し、後でその環境変数が設定されているかどうかを確認します。そうであれば、ルールをスキップし.*ます。そのようです:

RewriteRule ^i/com/(\w+)/(.*)$ framework/components/$1/images/$2 [E=REWRITE:1,L]
RewriteCond %{ENV:REDIRECT_REWRITE} !1
RewriteRule .* framework/init.php

少し醜いかもしれません。しかし、古いバージョンの Apache では魅力的に機能します。

于 2012-05-04T20:02:05.707 に答える