nginx proxy_passは完全なファイル名でのみ動作します

nginx proxy_passは完全なファイル名でのみ動作します

パス domain.de/pihole/* を pihole を実行している docker コンテナにプロキシする nginx があります。docker dontainer の IP (172.20.0.2) を使用すると、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;

        }
}

何を変更する必要があるか、何かアイデアはありますか? (「proxy_set_header」のほとんどの部分を serverfault からコピーしました)

答え1

/行末を削除してくださいproxy_pass。理由はドキュメントに記載されています。 プロキシパス

引用:

proxy_pass が URI なしで指定されている場合、元のリクエストが処理されるときにクライアントから送信されたのと同じ形式でリクエスト 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に必要であるという事実(以前は知らなかったこと)について少し試行錯誤しました。

関連情報