外部アセット nginx にリダイレクト

外部アセット nginx にリダイレクト

私の目標は、他のサーバーに proxy_pass できる nginx を 1 つ持つことです。

Desired input

https://example.com/https://assets1.com/image.jpg?utm=whatever

Desired output
https://assets1.com/image.jpg?utm=whatever

ここが私の所在地ブロックです

server {

    index index.html index.htm index.nginx-debian.html;
    server_name example.com www.example.com;

    location ~/(.*) {
            if ($request_method = 'GET') {
                    add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User->
    }
    proxy_pass https://$1$is_args$args/;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host "www.example.com";
}
listen 80;
listen       [::]:442 ssl ipv6only=on;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

そして、次のようなエラーが表示されます:

2021/09/21 09:27:32 [エラー] 8475#8475: *16アップストリームの無効なポート "https:/assets1.com/image.jpg?utm=whatever"、クライアント: [IP]、サーバー: domain.com、リクエスト: "GET /https://assets1.com/image.jpg?utm=whatever HTTP/1.1"、ホスト: "example.com"

答え1

元のリクエスト URL にプロトコル プレフィックスが含まれています: https://example.com/https://assets1.com

ブロックlocationは最初の の後の部分をキャプチャするため/、 に$1なりますhttps://assets1.com

ステートメントにproxy_passは がありhttps://$1$is_args$argshttps://https://assets1.com変数が展開されると になります。

https://assets1.comnginx はドメイン:ポートのペアとして解析しようとするため、URL のドメイン部分は でhttps、ポートは空の文字列になります。

この問題に対処するために、次の構成を提案します。

location ~^/https://(.+)$ {
    proxy_pass https://$1$is_args$args;
    ...
}

この方法では、プロトコル部分が $1 にキャプチャされないようにして、適切な URL を取得します。また、正規表現をより堅牢にするために、開始アンカーと終了アンカーを追加しました。

関連情報