読者です 読者をやめる 読者になる 読者になる

NginxのConfで変数と文字列を区別する方法

今となっては非常につまらないことで悩んだ話、、

結論からいうと、変数を$xxxxではなく、${xxxx}と書きましょうという話です。

NginxでConfの中に変数と文字列が出てくることがあると思います。

例えば
http:///aaa/test.jsp?arg01=bbb&yyyyyy&arg02=ccc のyyyyyy部をzzzzzzに書き換えてフォワードするようなケースです。

何も考えずに下記のようなConfを書くとエラーに、、

[infra@rp01 vhost]$ cat testdomain.conf
  :
           if ($request_uri ~ "^((?<p0>.*)\/test.jsp(?<p1>.*)yyyyyyy(?<p2>.*))") {
              proxy_pass http://$test_web$p0/test.jsp$p1zzzzzz$p2;
           }
  :
[infra@rp01 vhost]$ sudo nginx -t
nginx: [emerg] unknown "p1zzzzzz" variable
nginx: configuration file /etc/nginx/nginx.conf test failed

たしかにどこまでが変数なのかNginxが評価するのって大変だよなと思いつつ、
どうしたらいいんだと頭をひねって導き出した苦肉の策が下記でした。

[infra@rp01 vhost]$ cat testdomain.conf

  :
           if ($request_uri ~ "^((?<p0>.*)\/test.jsp(?<p1>.*)yyyyyyy(?<p2>.*))") {
              set $pattern "zzzzzz";
              proxy_pass http://$test_web$p0/test.jsp$p1$pattern$p2;
           }
  :
[infra@rp01 vhost]$ sudo nginx -t
nginx: the configuration file /opt//nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt//nginx/conf/nginx.conf test is successful

書き換え先の文字列を変数にしちゃうということです。

こうすれば、Nginxから見てもどこまでが変数か評価できるようで、
無事にConfigチェックを通過することができました。

そんな中、、

自分的にはめでたしめでたしだったのですが、
シェルスクリプト書いてるときに、そういやシェルでは${}で変数書くなあと気づき、
Nginxでも試してみたところ、、、

いけるやん、、、

ということで、変数を$p0ではなく、${p0}と書く、が正解だとわかりました。

[infra@rp01 vhost]$ cat testdomain.conf
  :
           if ($request_uri ~ "^((?<p0>.*)\/test.jsp(?<p1>.*)yyyyyyy(?<p2>.*))") {
              proxy_pass http://127.0.0.1${p0}/test.jsp${p1}zzzzzz${p2};
           }
  :
[infra@rp01 vhost]$ sudo nginx -t
nginx: the configuration file /opt//nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt//nginx/conf/nginx.conf test is successful

知ってる人が見たら一瞬で解消できるものかもしれませんが、
マニュアル見ても、けっこう頑張ってググってもわからなかったので、
せっかくの気づきを記事にしておきます。

それでは。