質問: ### やりたいこと 検索フォームでクエリパラメーターを複数送信した場合、 URLの重複を避けるために、URLを301Redirecrtしたいのですが、個別のパラメーターごとにリダイレクトしたいです。 たとえば、example.com/hoge/?a=AA&b=BB&c=CC というパラメーターのURLが合った場合、 #### 例1. example.com/hoge/?a=foo&b=&c= a=foo b= (空) c= (空) の場合は example.com/foo/に301リダイレクトで転送 #### 例2. example.com/hoge/?a=bar&b=&c= a=bar b= (空) c= (空) の場合は example.com/bar/に301リダイレクトで転送 #### 例3. example.com/hoge/?a=hogehoge&b=foo&c=bar a=hogehoge b=foo c=bar の場合には example.com/hogehoge-foo-bar/に301リダイレクトで転送 というように、複数のクエリ文字列を分岐させてリダイレクト先をそれぞれ設定したいです。 パラメーターごとの飛び先は手動で書いてもいいので、数が多くなってしまってもいいのですが まず、 * 複数のクエリパラメーターの取得 * 各クエリパラメーター毎に条件分岐 の仕方がわかりません。 #### うまく行かなかった内容 まず、例1の場合のみを想定して試しに以下のように書いてみたのですが、動きませんでした。 [code] RewriteEngine on RewriteCond %{QUERY_STRING} (^|&)a=([^&]+)($|&) RewriteRule .* - [E=X_A:%2] RewriteCond %{QUERY_STRING} (^|&)b=([^&]+)($|&) RewriteRule .* - [E=X_B:%2] RewriteCond %{QUERY_STRING} (^|&)c=([^&]+)($|&) RewriteRule .* - [E=X_C:%2] RewriteRule /hoge/ /{ENV:X_QUERY_HOGE}/ [R=301,L] [/code] お手数おかけしますが、どなたかおわかりになる方、教えていただければと思います。
回答: こんな感じでどうでしょうか? ``` RewriteEngine on RewriteCond %{QUERY_STRING} (^|&)a=(.*?)($|&) RewriteRule ^hoge/$ - [E=X_A:%2] RewriteCond %{QUERY_STRING} (^|&)b=(.*?)($|&) RewriteRule ^hoge/$ - [E=X_B:%2] RewriteCond %{QUERY_STRING} (^|&)c=(.*?)($|&) RewriteRule ^hoge/$ - [E=X_C:%2] RewriteCond %{ENV:X_A} .+ RewriteCond %{ENV:X_B} ^$ RewriteCond %{ENV:X_C} ^$ RewriteRule ^hoge/$ /%{ENV:X_A}/? [R=301] RewriteCond %{ENV:X_A} .+ RewriteCond %{ENV:X_B} .+ RewriteCond %{ENV:X_C} ^$ RewriteRule ^hoge/$ /%{ENV:X_A}-%{ENV:X_B}/? [R=301] ``` 以下同様に、 (・aだけが空で無いケース)記述済み ・bだけが空で無いケース ・cだけが空で無いケース (・aとbが空で無いケース)記述済み ・aとcが空で無いケース ・bとcが空で無いケース ・aとbとcが空で無いケース ・全部空のケース を記述すれば良いかと思います。