Mengapa direktif proxy_intercept_errors Nginx memerlukan penulisan ulang agar berfungsi dengan baik?

8

Berikut ini adalah contoh konfigurasi server Nginx. Tanpa blok lokasi "jimat ajaib", konten kesalahan yang diproksi menghasilkan halaman Nginx 404 alih-alih halaman kesalahan khusus yang dilayani.

Menghapus direktif proxy_intercept_errors melayani halaman kesalahan proksi yang tepat dengan header kode kesalahan http yang tepat.

Halaman kesalahan yang tidak diproksikan ditampilkan dengan benar terlepas dari keberadaan jimat magis.

Adakah gagasan tentang apa yang sebenarnya terjadi?

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;
    }
}
Aubrey Falconer
sumber

Jawaban:

4

Saya minta maaf jawaban ini terlambat, tetapi sekarang, dengan versi stabil v1.8.1 saat ini, konfigurasi yang Anda berikan harus bekerja tanpa jimat .

Jika Anda memberikan versi yang Anda coba, itu akan menjadi ide untuk melihat apakah bug telah diperbaiki atau jika konfigurasi cacat.

Saya sarankan Anda memeriksa konfigurasi Anda, karena Anda pasti tidak memerlukan /admin/lokasi ini atau rewritedirektif yang terkandung . Berhati-hatilah untuk menghapus segala sesuatu yang bukan bagian dari tes ini (dan yang tidak Anda tunjukkan) karena dapat mengganggu.

Sebagai upaya terakhir, Anda dapat mencoba cuplikan konfigurasi berikut yang berhasil diuji, dan mengintegrasikan perubahan secara perlahan dan melihat pada titik mana hasil berbeda dengan harapan:

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;
    }
}
Bernard Rosset
sumber
Terima kasih, Bernard. Saya menandai jawaban Anda sebagai diterima sejak waktu yang cukup telah berlalu sehingga saya tidak lagi mengingat versi Nginx yang saya uji ketika pertanyaan asli diajukan.
Aubrey Falconer