Weiterleitung zum externen Asset nginx

Weiterleitung zum externen Asset nginx

Mein Ziel ist es, einen Nginx zu haben, der per Proxy an andere Server weiterleiten kann.

Desired input

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

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

Hier mein Standortblock

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

}

Und der Fehler, den ich bekomme:

21.09.2021 09:27:32 [Fehler] 8475#8475: *16ungültiger Port im Upstream „https:/assets1.com/image.jpg?utm=whatever“, Client: [IP], Server: domain.com, Anfrage: „GET /https://assets1.com/image.jpg?utm=whatever HTTP/1.1“, Host: „example.com“

Antwort1

Ihre ursprüngliche Anforderungs-URL enthält das Protokollpräfix: https://example.com/https://assets1.com.

Ihr locationBlock erfasst den Teil nach dem ersten und wird /daher zu .$1https://assets1.com

In Ihrer proxy_passAnweisung haben Sie https://$1$is_args$args, das zu wird https://https://assets1.com, wenn die Variable erweitert wird.

nginx versucht, es als ein Domänen-Port-Paar zu analysieren https://assets1.com, sodass der Domänenteil der URL httpsund der Port eine leere Zeichenfolge ist.

Um das Problem zu beheben, schlage ich die folgende Konfiguration vor:

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

Auf diese Weise schließen wir den Protokollteil von der Erfassung in $1 aus, sodass wir eine richtige URL haben. Ich habe auch Start- und End-Anker hinzugefügt, um den regulären Ausdruck robuster zu machen.

verwandte Informationen