Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

nginx をプロキシサーバとして利用していて、URL がデコードされると困る場合

More than 3 years have passed since last update.

ruby (+webrick や +sinatra) でウェブサーバを起動しているのですが、ポート番号をコマゴマと指定するのもメンドクなりますね。

そのため nginx をリバースプロキシサーバとして用いて、バーチャルホストとして設定し、うまく行ったかに思えました。

ところが、URL に "[" が含まれている場合に ruby 側で Bad URI 例外が発生 (ウェブブラウザ側では 400 Bad Request) したわけです。

原因としては nginx がプロキシサーバとして、要求 URL をデコードし正規化までしてしまうことにあります。

例えば https://localhost:9801/document/%5bMEMO%5d%20nginx.mdhttps://localhost:9801/[MEMO]%20nginx.md になってしまうわけです。

この解決のため、次の点に注意して nginx.conf を修正しました。

  • proxy_pass ディレクティブに $request_uri 組み込み変数を使う
  • proxy_pass のホスト名指定に、直接 IP アドレスを指定する (localhost ですらなぜか名前解決に失敗し、502 Bad Gateway になるため)

これにより、ひとまずの解決としました (ただし副作用については未知数です)。

nginx.conf
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月現在) 探ってみてようやく解決の目処がついたので、覚え書きとしてここに残します。

参考資料

dearblue
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away