根本的な問題は、1 つのエンコーディング (具体的にはプラス記号はプラス記号) を持つリクエストから、別のエンコーディング (プラス記号はスペースを表す) を持つリクエストに移行しようとしていることです。解決策は、mod_rewrite が行うデコードをバイパスし、生のリクエストから直接パスをクエリ文字列に変換することです。
書き換えルールの通常の流れをバイパスするには、生のリクエスト文字列を環境変数に直接ロードし、通常の書き換えパスの代わりに環境変数を変更します。既にエンコードされているため、通常、クエリ文字列に移動するときにエンコードについて心配する必要はありません。ただし、プラス記号がスペースではなくプラス記号として適切に中継されるように、プラス記号をパーセント エンコードする必要があります。
ルールは信じられないほど単純です。
RewriteEngine On
RewriteRule ^script.php$ - [L]
# Move the path from the raw request into _rq
RewriteCond %{ENV:_rq} =""
RewriteCond %{THE_REQUEST} "^[^ ]+ (/path/[^/]+/[^? ]+)"
RewriteRule .* - [E=_rq:%1]
# encode the plus signs (%2B) (Loop with [N])
RewriteCond %{ENV:_rq} "/path/([^/]+)/(.*)\+(.*)$"
RewriteRule .* - [E=_rq:/path/%1/%2\%2B%3,N]
# finally, move it from the path to the query string
# ([NE] says to not re-code it)
RewriteCond %{ENV:_rq} "/path/([^/]+)/(.*)$"
RewriteRule .* /path/script.php?%1=%2 [NE]
この簡単な script.php は、それが機能することを確認します:
<input readonly type="text" value="<?php echo $_GET['tag']; ?>" />