Apacheの書き換えで単一のクエリ文字列パラメーターをオーバーライドするメカニズムを複数回、非常に熱心に検索しましたが、最新のApacheバージョン(この記事の執筆時点では2.4.3)であっても、それを行うオプションはないようです。 .
しかし、PHP クエリ文字列パーサーが複数の同一のクエリ文字列パラメーターの最後のみを返すという事実を利用する代替手段があります。
例:
http://www.domain.com/index.php?id=123&id=456
これにより、$_GET に次の単一 (!) エントリが返されます。
array(1) {
["id"]=>
string(3) "456"
}
そのため、オーバーライド パラメーターを既存のクエリ文字列の末尾に追加するだけで問題を解決できます(クエリ文字列内でそれらを削除する必要はありません)。繰り返されるパラメータの最後のオカレンスは、$_GET 配列になります。
残念ながら、QSA スイッチは常に元のパラメーターを新しいクエリ文字列の末尾に追加するため、この手法には適していません。古いパラメータを前置するスイッチはありません。そのため、QSA を使用する代わりに、RewriteCond で少し迂回して、元のクエリ文字列を自分でキャッチして先頭に追加する必要があります。
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([A-Za-z0-9\_]+)$ index.php?%1&rewrite=$1 [L]
RewriteCond の唯一の機能は、クエリ文字列を %1 にキャプチャすることです。条件の正規表現(.*)
は常に一致するため、次の RewriteRule は常に実行されます。
この手法を使用すると、上記のテストケースは次のように書き換えられます...
http://www.domain.com/index.php?rewrite=some_value&rewrite=this_rewrite_will_match_the_above_rule
...これは、PHP クエリ文字列パーサーによって次のように解釈されます。
$_GET["id"] => "this_rewrite_will_match_the_above_rule"
...それはあなたが望むものです。
これは、クエリ文字列の値を PHP の $_GET 配列から取得する場合にのみ機能することに注意してください。$_SERVER["QUERY_STRING"]
自分のコンテンツを解析したり、他のプログラミング言語を使用したりすると、必ずしも機能するとは限りません。