nginxでリファラによってプロクシ先を変更する

nginxでリファラによってプロクシ先を変更する

nginxで動作しているウェブサーバから複数のバックエンドサーバへリバースプロキシをしています。
ほとんどのバックエンドサーバはお行儀がいいので /hoge 以下がAサーバ、/fuga以下ならBサーバという設定ですみます。

location ~ ^/hoge {
    proxy_pass http://server-a.example.com ;
}

location ~ ^/fuga {
    proxy_pass http://server-b.example.com ;
}

ところが中にはHTML中のスクリプトや、イメージで ../scripts とか指定してくる人いて、しかも複数いたりします。
同一URIパスだけど、リファラによってリバースプロキシ先を変更する必要があるのですが、どうしたらいいんだろ。

ifを使う

location中でifを使うといいかな、とこんな風に書いてみたんですが意図した動作をしません。

location ~ ^/scripts {
    if ( $http_referer ~ /hoge/ ){
        proxy_pass http://server-a.example.com ;
    }

    if ( $http_referer ~ /fuga/ ){
        proxy_pass http://server-b.example.com ;
    }
}

なんでかわかりませんww
location中でifを使うんじゃねえって記事も見つかるのでそういう使い方は禁忌みたい。

mapを使う

ってことで変数を利用します。if分でプロクシ先のURIを変数へいれてもいいんですが、mapを使うとスマート。

map $http_referer $proxyhost {
        ~/hoge/               "http://sever-a.example.com" ;
        ~/fuga/                "http://server-b.example.com" ;
}

これをserverセグメントの外に書く。
locationで設定した変数を使う。

    location ~ ^/scripts/ {
        proxy_pass $proxyhost ;
    }