Nginx でクエリストリングを処理するには、以下の内部変数を使用します。
クエリストリング hoge の値を使用してリダイレクトさせたい時に以下の方法で説明されている記事をたびたび見かけますが。
set $keyword_value "";
if ( $args ~ "hoge=(.*)" ) {
set $keyword_value $1;
}
if ( $keyword_value != "" ) {
rewrite ^(/.*)$ $1/$keyword_value/? permalink;
break;
}
この方法だとクエリストリングが ?hoge=1&fuga=2
だった場合に $keyword_value
が 1&fuga=2
となってしまい、辛い目にあいます。
なので、積極的に $arg_name
を使用しましょう。
(クエリストリングとして ?hoge=1
が与えられている場合 $arg_hoge
を参照することで hoge にセットされた値がわかります。)
if ( $arg_hoge != "" ) {
rewrite ^(/.*)$ $1/$arg_hoge/? permalink;
break;
}
また year
, month
, day
のような複数のクエリストリングを元にリダイレクトしたい場合が結構ありますが、こういったときも簡単です。
例えば ?year=2017&month=01&day=06
を/2016/01/07/
にリダイレクトさせたい時なんかは、こうなりますかね?
# year がセットされていなければ month を無視、year, month がセットされていなければ day を無視
set $keyword_date "$arg_year";
if ( $keyword_date != "" ) { set $keyword_date "$keyword_date$arg_month"; }
if ( $keyword_date != "" ) { set $keyword_date "$keyword_date$arg_day"; }
# year だけがセットされていた時
if ($keyword_date ~ "^[12][0-9][0-9][0-9]$") {
rewrite ^(/.*)$ $1/$arg_year/? permalink;
break;
}
# year, month がセットされていた時
if ($keyword_date ~ "^[12][0-9][0-9][0-9][01][0-9]$") {
rewrite ^(/.*)$ $1/$arg_year/$arg_month/? permalink;
break;
}
# year, month, day がセットされていた時
if ($keyword_date ~ "^[12][0-9][0-9][0-9][01][0-9][0-3][0-9]$") {
rewrite ^(/.*)$ $1/$arg_year/$arg_month/$arg_day/? permalink;
break;
}