Meu objetivo é ter um nginx que possa proxy_pass para outro servidor.
Desired input
https://example.com/https://assets1.com/image.jpg?utm=whatever
Desired output
https://assets1.com/image.jpg?utm=whatever
Aqui meu bloco de localização
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
}
E o erro que recebo:
2021/09/21 09:27:32 [erro] 8475#8475: *16porta inválida no upstream "https:/assets1.com/image.jpg?utm=whatever", cliente: [IP], servidor: domínio.com, solicitação: "GET /https://assets1.com/image.jpg?utm=whatever HTTP /1.1", host: "exemplo.com"
Responder1
Seu URL de solicitação original contém o prefixo do protocolo: https://example.com/https://assets1.com
.
Seu location
bloco captura a parte depois de first /
, então $1
se torna https://assets1.com
.
Na sua proxy_pass
declaração você tem https://$1$is_args$args
, que se torna https://https://assets1.com
quando a variável é expandida.
O nginx tenta analisar https://assets1.com
como um par domínio:porta, portanto, a parte do domínio da URL é https
e a porta é uma string vazia.
Para resolver o problema, proponho a seguinte configuração:
location ~^/https://(.+)$ {
proxy_pass https://$1$is_args$args;
...
}
Desta forma excluímos que a parte do protocolo seja capturada em $1, para que tenhamos uma URL adequada. Também adicionei âncoras de início e fim para tornar o regex mais robusto.