nginx の passproxy で末尾のスラッシュを削除するにはどうすればいいですか?

nginx の passproxy で末尾のスラッシュを削除するにはどうすればいいですか?

nginx proxy passを使用して以下のようにアクセスしたいと思います。

proxy.com/api/ -> proxy.com/api(接続サイトは example.com です)

proxy.com/api -> proxy.com/api(接続サイトは example.com です)

最初のものはうまくいきました。

2 番目は 404 エラーを発生させるか、末尾のスラッシュにリダイレクトします。

server {
    listen       80;
    server_name  proxy.com;


    location / {
        root   html;
        index  index.html index.htm;
    }

    location /api {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        rewrite ^/api(.*)$ $1?$args break;
        # rewrite ^/api(.*)/$ /$1 break;

        proxy_pass http://exmaple.com;
        proxy_redirect off;

        
    }
}

これを実行すると、次のエラーが発生します。

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Dec 07 06:55:15 UTC 2022
There was an unexpected error (type=Not Found, status=404).

エラーログ

the rewritten URI has a zero length, client: 127.0.0.1, server: proxy.com, request: "GET /api HTTP/1.1", host: "proxy.com"

以下を試してみましたが、同じエラーが発生します。

nginx 末尾のスラッシュによる書き換え

答え1

proxy_pass http://exmaple.com;つまり、プロキシのターゲットはサイトのルートにあるようです。その結果、ルートを指定しない HTTP リクエストが発生し、/URI の長さがゼロであるというエラーが発生します。

locationプロキシの外部に書き換えを移動してみます。

server {
    listen      80;
    server_name proxy.example.com;

    # . . .

    location ~ ^/api$ {
        return 301 http://proxy.example.com/
    }

    location /api/ {
        proxy_pass http://target.example.com;
    }
}

関連情報