0

古いスタイルの URL を新しいスタイルに変換するルールがあります。クエリで同じ順序のパラメーターを使用する限り、問題なく動作します。

RewriteCond %{QUERY_STRING} ^country=([a-z]{2})&id=([0-9]+)$ [NC]
RewriteRule ^(.*)$ http://%1.localhost/%2? [R=301,L]

したがって、url localhost/index.php?country=us&id=1234 は us.localhost/1234 に移動します。

しかし、問題は localhost/index.php?id=1234&country=us を使用すると (引数が順番に入れ替わっていることに注意してください)、もちろんルールは適用されません。

次のように、引数を個別に処理するようにルールを変更することを考えました。

RewriteCond %{QUERY_STRING} country=([a-z]{2}) [NC]
RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule ^(.*)$ http://%1.localhost/%2? [R=301,L]

しかし、localhost/index.php?id=1234&country=us と入力すると、1234.localhost/us が表示されますが、これは私が期待するものではありません (最初の cond で %1 が返され、2 番目の cond %2 で返されると予想されますが、順序が間違っているようです)このように決定されません)

これを達成する簡単な方法はありますか?もちろん、それぞれのケースを処理する 2 つの個別のルールを作成することもできますが、一般的なアプローチを使用できるかどうか疑問に思っていました (3 つのパラメーターがある場合、順列によってこれが管理不能になると考えてください)。

4

1 に答える 1

0

ドキュメントから、最後の一致からのルールのみを参照できるようです:

RewriteCond 後方参照: これらは、%N (0 <= N <= 9) の形式の後方参照です。%1 から %9は、現在の条件セットで最後に一致した RewriteCond から、パターンのグループ化された部分 (ここでも括弧内) へのアクセスを提供します。%0 は、そのパターンに一致する文字列全体へのアクセスを提供します。

私はこれを行うための良い方法について頭を悩ませてきましたが、思いつくことができる最善の方法は、複数のルールを使用してデータを環境変数に抽出し、最後にそれらを参照して最終的な書き換えを行うことです。

このようなもの:

RewriteCond %{QUERY_STRING} country=([a-z]{2}) [NC]
RewriteRule ^(.*)$ - [E=URL_COUNTRY:%1]

RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule ^(.*)$ - [E=URL_ID:%1]

RewriteRule ^(.*)$ http://%{ENV:URL_COUNTRY}.localhost/%{ENV:URL_ID}? [R=301,L]
于 2012-12-04T23:55:11.843 に答える