2012-05-02 18 views
0

すべての要求パスを初期化ファイルに書き換えようとしています。これと同じように:除き特定のルールが一致した後にApacheリライトエンジンを終了する

RewriteRule .* framework/init.php 

、この枠組みの中のファイルはPHPによって処理される要求をせずに提供することができる、そこからいくつかのディレクトリがあります。しかし、これらのディレクトリへの実際のパスを使用したくないのは、私はこれらのパスをPHPルータが解釈できるようにしたいからです。 したがって、私はこれらのディレクトリの別名を持っていたいと思います。例:

これらの書き換えルールはどちらも個別に動作するのが問題ですが、それらを組み合わせようとすると問題が発生します。エイリアスの書き換えが発生した後で、.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つRewriteRulesのいずれかを取り外す際に作業を開始すること。私は同様の質問を探しましたが、それらはすべて私が適用しようとした解決策を持っています。彼らの質問と私の違いの1つは、 "特別な"ディレクトリを、通常要求されたときにinit.phpに書き換えるディレクトリに書き換えたいということです。誰もがこれがすべて可能であるかどうか私に教えてもらえますか?

+0

フレームワークの下で/ init.phpとinit.phpを経由する他のすべてのリクエストに書き直してはいけないことは何ですか? – sfaiz

+0

いいえ特定の方法で/ i/[something]へのリクエストを特定のフォルダに書きたい、そして/framework/init.phpに対する他のすべてのリクエストを書きたいと思います。/i /要求を書き換えようとしているフォルダは通常は要求できないものです。通常の要求はinit.phpに書き換えられます。 – Avaq

答えて

0

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

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

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

0

some researchを行った後、私は中に書き直された後に書き換えエンジンが実際にパスを再評価ないことが判明:

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

書き換えエンジンを完全に停止するには、[END]フラグを使用する必要があります。

代替フラグ[END]を使用すると、現在の再書き込み処理の終了だけでなく、以降の再書き込み処理がディレクトリ単位(htaccess)コンテキスト内で発生しないようにすることができます。これは、外部リダイレクトによる新しい要求には適用されません。

ただし、この[END]フラグはnew since Apache 2.4です。

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

結論は:私がしていないApache 2.4を持っていなければ、それはできません。

編集:誰かがそれを行う "古い"方法を知っているとき、私はこの答えを "unchosen"のままにします。