ruby (+webrick や +sinatra) でウェブサーバを起動しているのですが、ポート番号をコマゴマと指定するのもメンドクなりますね。
そのため nginx をリバースプロキシサーバとして用いて、バーチャルホストとして設定し、うまく行ったかに思えました。
ところが、URL に "[" が含まれている場合に ruby 側で Bad URI 例外が発生 (ウェブブラウザ側では 400 Bad Request) したわけです。
原因としては nginx がプロキシサーバとして、要求 URL をデコードし正規化までしてしまうことにあります。
例えば https://localhost:9801/document/%5bMEMO%5d%20nginx.md
が https://localhost:9801/[MEMO]%20nginx.md
になってしまうわけです。
この解決のため、次の点に注意して nginx.conf
を修正しました。
-
proxy_pass
ディレクティブに$request_uri
組み込み変数を使う -
proxy_pass
のホスト名指定に、直接 IP アドレスを指定する (localhost
ですらなぜか名前解決に失敗し、502 Bad Gateway になるため)
これにより、ひとまずの解決としました (ただし副作用については未知数です)。
http {
server {
server_name mypc1.home;
proxy_set_header Host $host:9801;
location / {
proxy_pass http://127.0.0.1:9801$request_uri;
}
}
}
解決方法を以前から探っていたのですが、その頃は Apache (mod_proxy) の nocanon
しか情報が見当たらず、nginx は未対応としかありませんでした。
今回 (平成29年3月現在) 探ってみてようやく解決の目処がついたので、覚え書きとしてここに残します。