LoginSignup
9
12

More than 5 years have passed since last update.

[nginx] クエリストリングでリダイレクトさせるには?

Last updated at Posted at 2017-01-06

Nginx でクエリストリングを処理するには、以下の内部変数を使用します。

  • $arg_name argument name in the request line
  • $args arguments in the request line

クエリストリング 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_value1&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;
}
9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12