Nginxのproxy_intercept_errorsディレクティブが正しく機能するために書き換えが必要なのはなぜですか?


8

以下は、Nginxサーバー構成のサンプルです。「魔法のタリスマン」ロケーションブロックがない場合、プロキシ化されたエラーコンテンツは、カスタマイズされたエラーページではなく、Nginx 404ページを提供します。

proxy_intercept_errorsディレクティブを削除すると、適切なhttpエラーコードヘッダーを含む適切なプロキシエラーページが提供されます。

プロキシされていないエラーページは、魔法のお守りの存在に関係なく適切にレンダリングされます。

正確には何が起こっているのかについてのアイデアはありますか?

server {
    server_name     mydomain.com "";
    listen          80;
    root            /var/www;
    error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
    proxy_intercept_errors on;

    location /proxy/ {
        proxy_read_timeout  60s;
        proxy_set_header    Host $host;
        proxy_pass          http://myservers;
    }

    location /test404/ {
        return 404;
    }

    location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
        rewrite ^(/admin)(.*)$ /admin$2 break;
    }
}

回答:


4

この回答が遅くなって申し訳ありませんが、現在のところ、現在のv1.8.1安定バージョンでは、提供した構成はtalismanなしで動作するはずです。

実験中のバージョンを提供した場合、バグが修正されているかどうか、または構成に欠陥があるかどうかを確認することをお勧めします。

この/admin/場所やそれに含まれるrewriteディレクティブは絶対に必要ないので、構成を再確認することをお勧めします。干渉する可能性があるため、このテストの一部ではない(および表示されていない)すべてを削除する場合は、特別な注意を払ってください。

最後の手段として、以下のテストを成功させ、構成スニペットを試し、変更をゆっくりと統合して、結果が期待と異なる点を確認できます。

server {
    listen      80;
    listen      [::]:80;
    server_name example.org;

    location /proxy {
        return 418 "Host: $host, Connection: $http_connection";
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name example.com;

    root /var/ious/files;

    error_page 418 = /error_page.html;
    proxy_intercept_errors on;

    location /proxy {
        proxy_pass http://example.org;
    }
}

ありがとう、バーナード。十分な時間が経過したため、元の質問が出されたときにテストしていたNginxのバージョンを思い出せなくなったため、回答を承認済みとしてマークします。
オーブリーファルコナー2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.