외부 자산 nginx로 리디렉션

외부 자산 nginx로 리디렉션

내 목표는 다른 서버에 Proxy_pass할 수 있는 하나의 nginx를 갖는 것입니다.

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블록은 first 이후의 부분을 캡처하므로 /$1됩니다 https://assets1.com.

proxy_pass귀하의 명령문 에는 변수가 확장될 때 https://$1$is_args$args되는 이 있습니다 https://https://assets1.com.

https://assets1.comnginx는 도메인:포트 쌍으로 구문 분석을 시도하므로 URL의 도메인 부분은 비어 있고 https포트는 빈 문자열입니다.

이 문제를 해결하기 위해 다음 구성을 제안합니다.

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

이런 식으로 프로토콜 부분이 $1에 캡처되지 않도록 제외하여 올바른 URL을 갖게 됩니다. 또한 정규식을 더욱 강력하게 만들기 위해 시작 및 끝 앵커를 추가했습니다.

관련 정보