nginx
rewrite

NginxでQuery Stringを判定して、Rewriteする

More than 1 year has passed since last update.

Nginxにあまり触れていないaraiです。
NginxでQuery Stringの値を判定し、rewriteさせるメモです。

やりたいこと

codeの値を判定して、301転送を振り分けしたい。
Query Stringのcodeの値がユニークで別のものになっているので、正規表現は使えない。


http://example.jp/aaaaa?code=b1111 ⇒301転送 http://example.jp/aaaaa?code=centos
http://example.jp/aaaaa?code=b2222 ⇒301転送 http://example.jp/aaaaa?code=ubuntu
http://example.jp/aaaaa?code=b3333 ⇒301転送 http://example.jp/aaaaa?code=debian
http://example.jp/aaaaa?code=b4444 ⇒301転送 http://example.jp/aaaaa?code=redhat

http://example.jp/zzzzz?code=b1111 ⇒301転送 http://example2.jp/zzzzz?code=centos
http://example.jp/zzzzz?code=b2222 ⇒301転送 http://example2.jp/zzzzz?code=ubuntu
http://example.jp/zzzzz?code=b3333 ⇒301転送 http://example2.jp/zzzzz?code=debian
http://example.jp/zzzzz?code=b4444 ⇒301転送 http://example2.jp/zzzzz?code=redhat
:
:
100件以上。


設定方法

最初はこんな感じで、やればいいんでしょ。っと思ってましたが、全然NGでした。

rewrite /aaaaa?code=b1111$ http://example.jp/aaaaa?code=centos permanent;
rewrite /aaaaa?code=b2222$ http://example.jp/aaaaa?code=ubuntu permanent;
rewrite /aaaaa?code=b3333$ http://example.jp/aaaaa?code=debian permanent;
rewrite /aaaaa?code=b4444$ http://example.jp/aaaaa?code=redhat permanent;
                :
                :

とりあえず、以下で想定通りの動きは確認できました。

set $keyword_name "";

if ($args ~ "code=(.*)") {
    set $keyword_name $1;
}
if ($keyword_name = "b1111") {
    rewrite ^/aaaaa.*$ http://example.jp/aaaaa?code=centos? permanent;
    rewrite ^/zzzzz.*$ http://example2.jp/zzzzz?code=centos? permanent;
    break;
}
if ($keyword_name = "b2222") {
    rewrite ^/aaaaa.*$ http://example.jp/aaaaa?code=ubuntu? permanent;
    rewrite ^/zzzzz.*$ http://example2.jp/zzzzz?code=ubuntu? permanent;
    break;
}
if ($keyword_name = "b3333") {
    rewrite ^/aaaaa.*$ http://example.jp/aaaaa?code=debian? permanent;
    rewrite ^/zzzzz.*$ http://example2.jp/zzzzz?code=debian? permanent;
    break;
}
if ($keyword_name = "b4444") {
    rewrite ^/aaaaa.*$ http://example.jp/aaaaa?code=redhat? permanent;
    rewrite ^/zzzzz.*$ http://example2.jp/zzzzz?code=redhat? permanent;
    break;
}
                :
                :

注意点

転送先の最後に?を付けないと・・・

NginxはQuery Stringを自動で引き継いで設定するようです。
転送先の最後に?を付けることで、転送先にQuery Stringを引き継がせないようにしています。

if ($args ~ "code=(.*)") {
    set $keyword_name $1;
}
if ($keyword_name = "b1111") {
    rewrite ^/aaaaa.*$ http://example.jp/aaaaa?code=centos permanent;
                                ↑ここの?を取った。
    break;
}

上記の設定だと、以下のように、最後尾に &code=b1111 が付いてきてしまいます。
http://example.jp/aaaaa?code=b1111 ⇒301転送 http://example.jp/aaaaa?code=centos&code=b1111

転送先の最後に?を付けた場合
http://example.jp/aaaaa?code=b1111 ⇒301転送 http://example.jp/aaaaa?code=centos

最後に

Nginxの設定はちょっとプログラムっぽく長くなったけど、もっと簡単にできる方法があるのかも。。