2016-12-04 4 views
2

/mydir/にある.htaccessにはどのようなRewriteRuleを使用し、HTTP 302はすべての要求をhttp://www.example.com/mydir/outputにリダイレクトする必要がありますか? /mydir/.htaccess.htaccess内のRewriteRuleパターンの否定により、リダイレクトが多すぎる

現在のコンテンツ:

RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule !"^output$" "output" [R] 

入力するURL:

http://www.example.com/mydir/input1

http://www.example.com/mydir/input2

予想される出力:

http://www.example.com/mydir/output

http://www.example.com/mydir/output

http://www.example.com/mydir/output

実出力:

ERR_TOO_MANY_REDIRECTS

ERR_TOO_MANY_REDIRECTS

ERR_TOO_MANY_REDIRECTS

答えて

-1

あなたのURLがoutputで始まるされていない場合はチェックしている、そしてそれは常にそうです。ルールを変更します。

RewriteEngine On 
RewriteRule !^/mydir/output$ /mydir/output [R] 
+0

ありがとうございますが、残念ながらうまくいきません。出力はまだ 'ERR_TOO_MANY_REDIRECTS'です。たぶんこれが原因ですが、わかりません: 'ルールが定義されているディレクトリパスは、比較の前に現在マップされているファイルシステムパスから削除されます(末尾のスラッシュまで)。このディレクトリごとのプレフィックスストリッピングの正味の結果は、この文脈のルールは、ルールが定義されている現在のマップされたファイルシステムパス "below"の部分に対してのみマッチすることです。 httpd.apache.org/docs/current/mod/mod_rewrite.html#what_is_matched) –

+0

パターンが ''^output $ "'( '!'なし)の場合、次のURLは期待どおりに一致します: 'http:// www.example.com/mydir/output'と入力します。そして、期待通りにそれにマッチするものはありません。だから、同じパターンが否定されたとき、私はそれが**上記のURLにマッチしない**と思うが、**他のすべてのものとマッチするはずだ。しかし、書き換えループ(?)は、上記のURLも一致していることを示しているため、すべてが一致するようです。 –

+0

あなたは正しいです。二重チェック。回答が更新されました。あなたはもう一度チェックできます:) – Dekel

0
RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule "^output$" "-" [L] 
RewriteRule ".*" "output" [R] 
# Further rules are not processed. 

否定は動作しない理由を私は知らないが、元のRewriteRuleは、上記のこれら2に置き換えることができます。このようにして、リダイレクトループを回避するために、URLがすでに予期された出力(​​SubstitutionとL flagを参照)である場合、最初のRewriteRuleがリライト処理全体を停止します。それ以外の場合は、2番目のRewriteRuleによってすべてが期待される出力URLに書き換えられます。書き換えプロセス全体を停止することを避ける必要がある場合は、無条件(2番目)のRewriteRuleだけをスキップすることができますので、それ以降のすべてのルールが処理されます。これを達成するために、以下のようにS flagを使用します。

RewriteEngine On 
RewriteBase "/mydir/" 
RewriteRule "^output$" "-" [S=1] 
RewriteRule ".*" "output" [R] 
# Further rules are processed as well. 
0

をあなたのルールにLフラグを逃しているが、それはあまりにも幅広いです。それがサーバーに送信された実際のURLであった場合にのみ一致する必要があります。私はその要求の最終的な宛先がoutputという名前の拡張子のないファイルだとは思っていませんが、それはあなたのルールが主張しているものです。試してみてください:

RewriteEngine On 
RewriteBase /mydir/ 
RewriteCond %{THE_REQUEST} !^\S++\s++/mydir/output\s 
RewriteRule^output [NS,R,L] 
# rules after this should now be processed 
関連する問題