5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

参考資料

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?