1
1

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 1 year has passed since last update.

NginxでURLエンコードされたパスを含むURLをデコードしないでバックエンドのAPIサーバーにプロキシしたい

Posted at

NginxでURLエンコードされたパスを含むURLをデコードしないでバックエンドのAPIサーバーにプロキシする話。デコードしないままパスの一部を書き換えてプロキシする方法の解説。

背景

NginxでReactのページを返しつつAPIへのリクエストはhttp://172.17.0.1:8080で動くAPIサーバーにプロキシしたいという状況で、/api/~~~というフロントからのリクエストをNginxで受けて/~~~のように先頭の/apiを削除してプロキシしたいという状況です。

今回、URLは/api/aaa/bbb%2Fccc/dddのようにURLエンコードされたパスを含むことがあります。この場合、

server {
    # HTTPSを利用する設定
    listen       80;
    server_name  localhost;
    location / {
        # Reactを返す方の処理
        root /usr/share/nginx/html;
    }

    location /api/ {
        # APIサーバーにプロキシする処理
        proxy_pass http://172.17.0.1:8080;
    }
}

のように普通にプロキシした場合Nginxにデコードされ/aaa/bbb/ccc/dddのように%2Fをデコードした状態でAPIサーバーに送られてしまいます。

今回はこのデコードされる処理を回避する方法を紹介します。

デコードしない方法

$request_uriにはデコードする前のクエリパラメータ付きのオリジナルのURIが入っています。今回は先頭の/apiを削除したいので$request_uriから先頭の/apiを削除し$stripped_uriに格納しproxy_passに渡しています。

server {
    # HTTPSを利用する設定
    listen       80;
    server_name  localhost;
    location / {
        # Reactを返す方の処理
        root /usr/share/nginx/html;
    }

    location /api/ {
        # APIサーバーにプロキシする処理
        set $proxy_uri $request_uri;
        if ($request_uri ~ ^/api(.*)$) {
            set $proxy_uri $1;
        }
        proxy_pass http://172.17.0.1:8080$proxy_uri;
    }
}

これで/api/aaa/bbb%2Fccc/dddhttp://172.17.0.1:8080/aaa/bbb%2Fccc/dddにプロキシされます。

終わり。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?