要件
サーバー側で、日本語のパラメーターが付いた以下のようなパス
/example/index.html?param1=元のパラメーター¶m2=example.....
を、param1のみ別のパラメーターに変換しそれ以外は引き継いだ状態でリダイレクトする。
設定内容
RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC(&|$)
RewriteCond %{QUERY_STRING} (.*?)&?param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC&?(.*)
RewriteRule ^example/index\.html /example/index.html?param1=リダイレクト先のパラメーター&%1&%2 [NE,R=301,L,QSD]
解説
RewriteCond %{QUERY_STRING} (^|&)param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC(&|$)
リダイレクト対象となるパラメーターの条件を記載します。
他にパラメーターが存在する場合は、前後にある別のパラメーターを存在しても問題無いように記述します。
上記は前後どちらにも存在する例です。
RewriteCond %{QUERY_STRING} (.*?)&?param1=%E5%85%83%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC&?(.*)
前後に存在しているパラメーターをそのまま取得します。
同じく前後どちらにも存在する例です。
RewriteRule ^example/index\.html /example/index.html?param1=リダイレクト先のパラメーター&%1&%2 [NE,R=301,L]
リダイレクトの詳細を記載します。
リダイレクト後のパスにはリダイレクト先パラメーターと、先程取得したその他のパラメーターを&%1&%2
のように結合します。
上手く動作しない場合
- .htaccessファイルの文字コードやサーバーの文字コード設定(AddDefaultCharsetなど)がUTF-8に統一されているかを念のため確認して下さい
(特に日本語を扱う場合はUTF-8が必須となります。) - URLエンコードが正しいか確認してください
- リダイレクト先にURLエンコード済の文字列を記述する場合、%を全てエスケープして記載してください
例:%E5%85%88
⇒\%E5\%85\%88
- NEオプションが付与されているか確認して下さい
補足
遷移先のパラメーターはURLエンコード済の状態では勿論ですが、日本語でも一応記述可能です。
RewriteCondの方は文字コードや設定が合っていれば問題ないと思うのですが、調べている過程でこちらも%にエスケープ処理を施さないと動作しない旨の記事が幾つもあり、もしかすると環境によるのかもしれません…。
(どなたか分かる方がいましたら教えて下さい。)