18

%0複数の RewriteCond を連鎖させた場合、最後の RewriteCond のキャプチャ グループのみを-で参照できます%9

次の問題では、URL のクエリ文字列のパラメーターは任意の順序で指定できます。それらを派手な URL に解析するには、クエリ文字列の各パラメーターを個別に一致させる必要があります。

RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %{QUERY_STRING} param2=([^&]+)
RewriteCond %{QUERY_STRING} param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]

私が指摘したように...これは機能しません。これを修正するには、次の RewriteCond で前の RewriteCond のキャプチャ グループを参照し、各パラメーターを実際の RewriteRule に「伝達」します。

RewriteCond %{QUERY_STRING} param1=([^&]+)
RewriteCond %1&%{QUERY_STRING} ^([^&]*)&.*param2=([^&]+)
RewriteCond %1&%2&%{QUERY_STRING} ^([^&]*)&([^&]*)&.*param3=([^&]+)
RewriteRule ^foo$ bar/%1/%2/%3/ [R]

これは機能するはずですが、追加のパラメーターごとに面倒になります。他の解決策は、1 つのパラメーターを解析し、各パラメーターの後にクライアントをリダイレクトすることである可能性があります (リダイレクトの長いチェーンが発生するため、これは避けたいと思います)。

RewriteRule 内のすべての RewriteCond のキャプチャ グループにアクセスするよりクリーンな方法はありますか (たとえば、別の場所で参照できるように、それらに名前を付けたり、変数に割り当てたりすることは可能ですか?)

4

2 に答える 2

10

書き換え条件内でターゲット URL を構築してみることができます。

RewriteCond ##%{QUERY_STRING}      (.*)##(|.*&)param1=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param2=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param3=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param4=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param5=([^&]+)
RewriteCond %1/%3##%{QUERY_STRING} (.*)##(|.*&)param6=([^&]+)

RewriteRule ^foo$ /bar%1/%3? [L,R]

リクエストしようとすると:

/foo?param1=a&param2=b&param6=3&param3=4&param5=5&param4=6

次の場所にリダイレクトされます。

/bar/a/b/4/6/5/3

必要なクエリ文字列パラメーターを追加しても、以前よりも乱雑に見えることはありません。

于 2013-07-22T17:20:48.660 に答える