nginx Proxy_pass는 완전한 파일 이름에서만 작동합니다.

nginx Proxy_pass는 완전한 파일 이름에서만 작동합니다.

domain.de/pihole/* 경로를 pihole을 실행하는 도커 컨테이너로 프록시해야 하는 nginx가 있습니다. docker dontainer(172.20.0.2)의 IP를 사용하면 index.php가 로드되고 172.20.0.2/admin 및 172.20.0.2/admin/index.php도 작동합니다. domain.de/pihole 또는 domain.de/pihole/admin을 사용하면 404가 표시됩니다. domain.de/pihole/admin/index.php를 사용하면 모두 작동합니다. 이것은 내 /etc/nginx/sites-available/default입니다.

server {
        listen 80 default_server;
        listen [::]:80 default_server;
 root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
                #proxy_pass http://172.20.0.2:25565;
        }
        location /pihole/ {
                proxy_pass http://172.20.0.2:80/;
                proxy_http_version 1.1;
                proxy_set_header Host $host:$server_port;
                proxy_set_header Referer $http_referer;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header X-Forwarded-Ssl on;
                proxy_set_header X-Nginx-Proxy true;
                proxy_set_header X-Client-Verify $ssl_client_verify;
                proxy_set_header X-Client-DN $ssl_client_s_dn;
                proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_redirect off;

        }
}

무엇을 변경해야 하는지 어떤 아이디어가 있습니까(serverfault에서 대부분의 "proxy_set_header" 항목을 복사했습니다)?

답변1

/줄 의 후행을 제거하세요 proxy_pass. 이유는 문서에 설명되어 있습니다. 프록시패스

인용하다:

URI 없이 Proxy_pass를 지정하면 요청 URI는 원래 요청이 처리될 때 클라이언트가 보낸 것과 동일한 형식으로 서버에 전달되거나 변경된 URI를 처리할 때 전체 정규화된 요청 URI가 전달됩니다.

location /some/path/ {
    proxy_pass http://127.0.0.1;
}

답변2

이 위치 블록으로 해결됨

location /pihole/ {
    proxy_http_version 1.1;
    proxy_set_header Referer $http_referer;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header X-Client-Verify $ssl_client_verify;
    proxy_set_header X-Client-DN $ssl_client_s_dn;
    proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://172.20.0.2/admin/;
}

/admin나는 슬래시와 pihole이 URL에 필요하다는 사실(이전에 몰랐던 것)에 약간의 시도와 오류를 사용했습니다.

관련 정보