0
RewriteRule ^resources/.+$ - [L]

RewriteRule .? index.php?t=$0 [QSA,L]

500 - Internal Server Error最初のリクエストとして正確に扱われる内部リダイレクトされたリクエストのために、同じルールが何度も繰り返されるため、が生成されます。それは無限の連鎖につながるでしょうindex.php?t=index.php&t=index.php&t=index.php&[...infinite more...]&t=test.php

しかし、私の意見では、これはそれほど良くはありません。

RewriteRule ^resources/.+$ - [L]

RewriteCond %{QUERY_STRING} !t=
RewriteCond %{REQUEST_URI} !^index\.php$
RewriteRule .? index.php?t=$0 [QSA,L]

これで、ユーザーはindex.php?t=test.phpアドレスとして入力できるようになったため、スクリプトを渡して、指定した場合と同じコンテンツを取得しますtest.php。私はそれが好きではありません。

では、内部リダイレクトを繰り返す問題なしに最初のものを実行するにはどうすればよいですか?
確かに、フラグVL - Very Lastでうまくいきますが、残念ながらそれは存在しません。

4

1 に答える 1

0

最初に、ルールに与えられたすべてのパラメーターを調べて、これが連鎖要求であるかどうかを示している可能性があります。つまり、1)変更されたURIに関連しない連鎖リクエストで変更された変数、または2)変更されたURIに関連し、変更されなかった変数(それを他の人と比較できるため)のいずれかが必要です。変更ました)。

問題は、ほとんどすべてが適用されたに従って更新されることRewriteRulesです。

IS_SUBREQ(1)とTHE_REQUEST(2)だけが興味深い変数ですが、残念ながら内部リダイレクトはサブリクエストとして扱われないため、表示されIS_SUBREQなくなります。THE_REQUEST変更されず、実際に指定されたパスが含まれているだけなので、エントリポイントが見つかりました。

これを念頭に置いて、ここに厄介な複雑な解決策があります:

RewriteEngine On

# Set SCRIPT_URI and SUBREQ
# MUST be the first statements in the file
 # SCRIPT_URI is the original browser-requested path
 # SUBREQ is "true" if the original browser-requested path is not overriden yet

 RewriteCond %{ENV:REQUEST_PARSED} !true
 RewriteCond %{THE_REQUEST} ^\s*\w+\s+(http://[^\s/]+/|/?)([^\s\?]*)[\s\?$]
 RewriteRule .? - [E=SCRIPT_URI:/%2,C]
 RewriteRule .? - [E=REQUEST_PARSED:true]

 RewriteCond %{ENV:SCRIPT_URI} ^(.*?)/\.($|/.*$)
 RewriteRule .? - [E=SCRIPT_URI:%1%2,N]

 RewriteCond %{ENV:SCRIPT_URI} ^(.*?)/[^/]+/\.\.($|/.*$)
 RewriteRule .? - [E=SCRIPT_URI:%1%3,N]

 RewriteCond %{ENV:SCRIPT_URI} ^(.*?)//\.\.($|/.*$)
 RewriteRule .? - [E=SCRIPT_URI:%1/%2,N]

 RewriteCond %{ENV:SCRIPT_URI}#%{REQUEST_URI} !^/*(.*)#/*\1$
 RewriteRule .? - [E=SUBREQ:true]

# SCRIPT_URI and SUBREQ are set now. Actual content follows:

RewriteCond %{ENV:SUBREQ} !true
RewriteRule ^resources/.+$ - [L]

RewriteCond %{ENV:SUBREQ} !true
RewriteRule .? index.php?t=$0 [QSA,L]    
于 2012-07-27T15:57:55.900 に答える