Saya mengonfigurasi penanganan nginx terhadap beberapa halaman kesalahan dan file media "default" lainnya (seperti favicon.ico dan robots.txt) saat ini dan saya mengalami masalah kecil membuat semuanya berfungsi seperti yang saya inginkan untuk halaman kesalahan tertentu .
Pada dasarnya, yang saya coba lakukan adalah melayani file-file tertentu untuk server di bawah root untuk server itu, misalnya /var/www/someserver.com/robots.txt. Jika file itu tidak ada, saya ingin nginx untuk pergi ke "default", yaitu /var/www/default/robots.txt. Ini adalah inti dasar dari bagaimana saya mengonfigurasikannya (berhasil):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Itu bagus sekali.
Saya mencoba melakukan hal yang sama untuk halaman kesalahan, dan saya tidak dapat mewujudkannya:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
Perhatikan bahwa ini "berfungsi" dalam arti bahwa jika Anda mengunjungi someserver.com/404.html, pertama-tama ia akan mencoba memuat /var/www/someserver.com/404.html dan kemudian kembali ke / var / www / default /404.html jika itu tidak ditemukan. Namun, jika Anda mengunjungi someserver.com/blahblah, itu hanya menampilkan halaman 404 jika diset di /var/www/someserver.com/. Itu tidak kembali ke direktori default jika file itu tidak ada.
Bagaimanapun, Anda mungkin dapat apa yang saya coba capai (itu sebabnya saya memasukkan contoh kerja pertama).
Ada ide?
Edit:
Berdasarkan jawaban Martin F, inilah yang akhirnya saya kumpulkan:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
Ini bekerja dengan luar biasa. Blok aktual error_pages dan lokasi di atas ada dalam file server_defaults.conf yang disertakan dengan setiap host virtual, itulah sebabnya saya tidak menyulitkan kode jalur ke setiap lokasi dan menggunakan jalur relatif untuk default.
Edit 2:
Pendekatan ini memiliki masalah. Jika Anda POST ke URL yang mengembalikan kesalahan, metode permintaan POST dikirim dengan upaya try_files. Ini (bagi saya) menghasilkan kesalahan 405 Tidak Diperbolehkan, karena nginx pada dasarnya mencoba POST untuk contoh /default/500.html alih-alih hanya mendapatkan halaman itu.
Edit 3:
Saya memposting solusi yang bekerja yang jauh lebih dekat dengan ide awal saya.
log_not_found off;
dan menambahkaninternal;
.try_files adalah cara untuk pergi ke sini. Konfigurasi berikut seharusnya berfungsi, tetapi saya belum mengujinya untuk kesalahan sintaksis.
sumber
Sayangnya saya terlambat beberapa tahun dengan jawaban saya, tetapi saya pikir itu mungkin membantu pencari masa depan. Versi Nginx saya yang terinstal adalah 1.2.4, dan saya telah membuat snippet konfigurasi berikut,
sumber
internal
.Saya merasa sangat penting untuk memasukkan "proxy_intercept_errors on;" di blok lokasi mana pun di mana error_page juga disertakan.
Tanpa pengaturan ini, maka blok lokasi akan mencegat kode kesalahan kembali dari hulu.
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
sumber