Cara terbaik untuk mencegah server default?

26

Saya memiliki sejumlah vhosts, dan saya ingin "mematikan" vhost default, baik dengan halaman kosong, halaman kesalahan, atau umumnya apa pun yang merupakan penggunaan sumber daya Nginx yang paling efisien, sementara hanya memungkinkan vhosts lain untuk diakses melalui domain yang ditentukan sebelumnya.

DanH
sumber

Jawaban:

42

Tetapkan default_server yang mengembalikan kode HTTP 444 :

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

(Mengembalikan kode kesalahan 4xx berarti permintaan dapat diartikan oleh klien sebagai permintaan yang tidak berhasil, bukan HTTP 200 Halaman Kosong Tapi Benar-benar Bekerja Percaya padaku .)

Rob Howard
sumber
2
444 adalah kode spesifik nginx non-standar : "
bzeaman
2
Ini tidak berfungsi untuk https. Mendengarkan 443 default_server sederhana tidak akan berfungsi karena ssl handshake terjadi pertama-tama dan nginx akan error sebelum mengembalikan 444. Salah satu solusi yang belum saya coba tetapi harus berfungsi adalah membuat sertifikat yang ditandatangani sendiri untuk server https default dan secara optikal redirect ke http untuk menghindari kesalahan browser.
Simon Bengtsson
Tiket nginx untuk menyediakan cara yang bagus untuk menolak koneksi SSL ada di sini . Mereka juga menyediakan solusi , pengaturan ssl_ciphers aNULL;.
nh2
Perhatikan solusi yang saya sebutkan akan mematahkan non-SNI-mampu HTTPS klien (seperti nginx sendiri proxy_pass, kecuali jika Anda mengatur proxy_ssl_server_name on;) mencapai lain server_names(jadi pada dasarnya istirahat sah server_namekarena port 443 yang Anda lakukan ingin membiarkan melalui). Lihat trac.nginx.org/nginx/ticket/195#comment:11 untuk detailnya.
nh2
4

Cukup tentukan vhost default yang akan menunjuk ke direktori dengan file index.html kosong.

server {
    listen       80 default_server;
    server_name  _ ;
    root /var/www/placeholder ; 
    index index.html;
}

dan tempatkan indeks kosong di / var / www / placeholder

wojciechz
sumber
itu akan menangkap setiap permintaan yang tidak mengenai nama domain Anda dan menanggapi dengan halaman kosong.
wojciechz
Tidak bisakah Anda hanya return '';sebaliknya root...index?
oriadam
0

mengapa tidak menolak saja semua

server {
    listen       80 default_server;
    server_name  _;

    location / {
        deny    all;
    }
}
Joel Ma
sumber