Nginxのリバースプロキシの際にクエリ文字列を渡したい

直近でやらないといけない作業があるため逃避がはかどり、当面の課題 の件の問題がいくらか切り分けられたのでメモ。初学者の覚え書きなので公共的な価値はないです。解決しました(根本原因はよく分らなかった……)。

 

やりたいことはここに近い。

 

たとえばブラウザに

http://example.com/?SandBox

と打ち込んだら、Nginx(ポート80)のリバースプロキシで転送して

127.0.0.1:8080/?SandBox

Apache(ポート8080)に渡したい。

 

Nginxのコンフィグにはこう書いた。

server {
      listen 80;
      server_name example.com;


      location ~^/ {

            rewrite ^/(.+) $1 break;

      proxy_pass http://127.0.0.1:8080/$1;
      }
}

 

実際動かしてみると、リクエストの転送はされるのだけどwikiのトップページに飛ぶだけで?SandBox部分が無視される。

Apache側のログにはこう出る。

127.0.0.1 - - [12/Jun/2018:02:24:22 +0900] "GET / HTTP/1.0" 200 9520 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"

127.0.0.1 - - [12/Jun/2018:02:24:22 +0900] "GET /skin/pukiwiki.css.php HTTP/1.0" 200 8445 "http://example.com/?SandBox" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"

 

最初のGETリクエストのURIにはクエリ部分”?SandBox”が含まれておらず、このせいでwikiがクエリを受け取れず動作しないと認識している。CSSを取りに行く次のリクエストでは、リファラ部分に?SandBoxを含むURIが入っていて、ここがなんでこうなるのかもよく分かっていない。

何かミスや抜けがあるのかもしれないけど、これは別にこういうもので、そもそも根本的に自分がhttpの動きを理解できてないだけという気もする。正しく動作した場合のイメージも曖昧なので、もう少し調べてみるつもり。

 

追記1

ログフォーマットに%qを足しても何も表示されなかったので、やはりクエリが渡せてないように見える。

 

追記2

namazu-tech.hatenablog.com

やっぱり単純にproxy_passにURIを与えるだけだとクエリは渡せないということで正解っぽい。リンク先の記事には解決方法まで書いてあり、auth_requestモジュールを導入できれば見様見真似で動かすことはできるのかもしれないけど、かなり理解が追いついていないので安易にやり方だけ真似るのも危なそうで、どうしたもんかなーと思っている。

 追記3

そもそも目的は既にNginxの動いてるサーバでphpを動かすことが目的だったので、「Nginxへのリクエストをphpの動くApacheにリバースプロキシする」が駄目なら「Nginxでphpが動くようにする」を試せばいいだけだった。php-fpmを少しいじったらあっさり動いたので、今回の件はこっちの方法で解決しました(なぜかphp-fpmが使えない理由があると思い込んでいたけど、別にそんなことはなかった)。