2017-06-12 3 views
1

私は、クエリ文字列は、DEBUGフレーズが含まれている場合の.htaccessに書き換え中のURLの現在の状態をエコーし​​よう:mod_rewrite書き換えルールは、置き換えの位置によって異なりますか?

RewriteCond %{QUERY_STRING} DEBUG 
RewriteRule .+ echo.php?ip=%{REMOTE_ADDR}&url=$0&query=%{QUERY_STRING} [L] 

を、私のecho.phpスクリプトが期待されるURLをエコーし​​ます。私が代わりにパラメータの順序を変更したときに

しかし、不思議なこと:

RewriteRule .+ echo.php?url=$0&ip=%{REMOTE_ADDR}&query=%{QUERY_STRING} [L] 

エコーされたURLは、それ自体が "echo.php" です。 これが予想される動作ですか、もしそうなら、なぜですか?

+0

バックリファレンスをエスケープするために '[B]'フラグを追加することができます。これは、エスケープされていないURLが追加された場合の問題です。とにかく 'REQUEST_URI'環境変数を使ってURLを取得することができます。あなたはそれを渡す必要はありません。' QUERY_STRING'と 'REMOTE_ADDR'と同じです。 PHPでは、 '$ _SERVER ['REQUEST_URI']'のような '$ _SERVER'配列にあります。また、このようにしたい場合は、 'ENV'を追加する必要があります。したがって、'%{ENV:REMOTE_ADDR} 'はアクセスしている環境変数と同じです。しかしあなたの質問に記載されている問題を解決するには、 '[B]'フラグを試してください。 – SuperDuperApps

+0

'[B]'フラグを追加しても役に立ちませんでした。 PHPスクリプトでURLを取得する方法を知ってくれてありがとうございましたが、mod_rewriteがどのように動作しているのか、そしてURLをエコーするのではなく奇妙な方法で動作する理由を知りたいと思っていました。 –

+0

@SuperDuperAppsあなたは "とにかくREQUEST_URI環境変数でURLを取得できます"と書いていますが、書き換えルールが2つ以上ある場合は、書き換えプロセスの途中でURLの現在の状態を取得できません。それは私がやったやり方だ。 –

答えて

0

私がテストするとき、私はあなたが述べている別の動作を取得しません。ルールをいずれかの方法で使用すると、example?DEBUGにアクセスすると、echo.phpがURLとして取得されます。これは、URLが変更されなくなるまで、.htaccessのルールがループし続けるためです(書き換えルールを含む書き換え後にディレクトリ全体の処理が再度開始されるため)。したがって、.+と一致しているので、以前のルールが途中で終了し、ルールに達する前にその繰り返しの処理を終了しない限り、常にecho.phpになります。

[END]フラグをルールに追加すると、mod_rewriteの処理が停止し、予想どおりの動作が得られます。あなたが見ている違いは、何らかの形で以前のルールが原因でなければなりません。

コメントに記載されているように、mod_rewriteをデバッグするには、LogLevel rewrite:traceXオプションを使用し、Xの数字が1〜8の数字を使用するのが良い方法です。情報ロットは8に向かって増加します。これはメイン設定でのみ有効にすることができます。 the documentationを参照してください。ロギングがすべてパフォーマンスに影響するため、必ず再度オフにしてください。以前のLogLevel指令に干渉することはありません。

関連する問題