Redirigir al activo externo nginx

Redirigir al activo externo nginx

Mi objetivo es tener un nginx que pueda pasar proxy_pass a otro servidor.

Desired input

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

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

Aquí mi bloque de ubicación.

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

}

Y el error que me sale:

2021/09/21 09:27:32 [error] 8475#8475: *16puerto no válido en aguas arriba "https:/assets1.com/image.jpg?utm=whatever", cliente: [IP], servidor: dominio.com, solicitud: "GET /https://assets1.com/image.jpg?utm=whatever HTTP /1.1", anfitrión: "ejemplo.com"

Respuesta1

La URL de su solicitud original contiene el prefijo de protocolo: https://example.com/https://assets1.com.

Su locationbloque captura la parte después del primero /, por lo que $1se convierte en https://assets1.com.

En su proxy_passdeclaración tiene https://$1$is_args$args, que se convierte https://https://assets1.comen cuando se expande la variable.

nginx intenta analizar https://assets1.comcomo un par dominio:puerto, por lo que la parte del dominio de la URL es httpsy el puerto es una cadena vacía.

Para abordar el problema, propongo la siguiente configuración:

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

De esta manera excluimos que la parte del protocolo sea capturada en $1, para que tengamos una URL adecuada. También agregué anclajes de inicio y fin para hacer que la expresión regular sea más robusta.

información relacionada