nginx server_name wildcard atau catch-all


119

Saya memiliki contoh menjalankan nginx yang melayani beberapa situs web. Yang pertama adalah pesan status di alamat IP server. Yang kedua adalah konsol admin aktif admin.domain.com. Ini bekerja dengan baik. Sekarang saya ingin semua permintaan domain lainnya dialihkan ke satu index.php- saya memiliki banyak domain dan subdomain dan tidak praktis untuk mencantumkan semuanya dalam konfigurasi nginx.

Sejauh ini saya sudah mencoba menyetel server_nameke *tetapi gagal karena wildcard tidak valid. *.*berfungsi sampai saya menambahkan blok server lain, maka saya kira itu bertentangan dengan mereka.

Apakah ada cara untuk menjalankan blok server penampung semua di nginx setelah situs lain ditentukan?

NB Saya bukan spammer, ini adalah situs asli dengan konten yang bermanfaat, mereka hanya didukung oleh CMS yang sama dari database!


1
Terbaik untuk menggunakan ini sebagai sumber utama nginx.org/en/docs/http/server_names.html
stephen

Jawaban:


147

Ubah opsi dengarkan ini di blok server penampung semua Anda. (Tambah default_server) ini akan mengambil semua koneksi yang tidak ditentukan (pada port yang ditentukan).

listen       80  default_server;

jika Anda ingin memasukkan semuanya ke index.php jika file atau folder tidak ada;

try_files                       $uri /$uri /index.php;

Bekerja dengan sempurna - terima kasih banyak. Saya tidak dapat menggunakan server_name _;untuk halaman status pada alamat IP, saya harus menentukan server_name x.x.x.xtetapi tidak apa-apa!
Ambil

1
Menambahkan default_servertampaknya tidak berfungsi pada nginx 1.4.6 yang saat ini merupakan versi terbaru di Ubuntu 14.04 ... Ketika saya menambahkannya, configtestperintah tersebut mengembalikan kesalahan, dan memulai ulang server juga tidak berfungsi. Saya telah mencoba konfigurasi yang sama persis di server saya dengan Debian jessie, yang memiliki nginx 1.6.2, dan berfungsi dengan sempurna. Jadi coba versi lain jika Anda menggunakan 1.4.6 ...
Nicomak

1
Catatan tambahan untuk HTTPS: default_serverarahan juga mengatur server yang akan menangani handshake SSL untuk permintaan pada port tersebut. Jadi, jika Anda ingin blok server A menangani SSL, tetapi server B bertindak sebagai penampung untuk HTTPS, solusinya adalah menyetel server_name ~^(.+)$pada server B.
Luke

66

Garis bawah sederhana juga berfungsi:

server_name  _;

Sumber: http://nginx.org/en/docs/http/server_names.html


2
Meskipun tautan ini mungkin menjawab pertanyaan, lebih baik menyertakan bagian penting dari jawaban di sini dan menyediakan tautan untuk referensi. Jawaban link saja bisa menjadi tidak valid jika halaman tertaut berubah.
Kmeixner

10
Tautan hanya disediakan sebagai referensi. Dua baris di atas sebenarnya adalah jawabannya: cukup dengan meletakkan garis bawah sebagai nilai untuk nama_server akan menghasilkan perilaku "tangkap semua" yang diinginkan.
jp.gouigoux

55
Jawaban ini tidak benar. Referensi menjelaskan bahwa ini tidak akan berfungsi kecuali Anda juga memiliki listen 80 default_serverkonfigurasi Anda.
Beetle

5
Lihat juga artikel ini .
Beetle

2
Mungkin saya salah paham dengan dokumennya, tetapi "Tidak ada yang istimewa tentang nama ini, ini hanya salah satu dari sekian banyak nama domain tidak valid yang tidak pernah bersinggungan dengan nama sebenarnya. Nama tidak valid lainnya seperti“ - ”dan“! @ # ”Mungkin sama-sama digunakan. ". Jadi, _apakah hanya nama yang tidak valid ?
Florian Klein

26

Ini akan berhasil:

server_name ~^(.+)$

13
server_name ~.tampaknya lebih efisien
youfu

2
Ini berhasil untuk saya. Untuk alasan apa pun saya tidak bisa mengaktifkan default_server, itu menimpa semua vhost saya yang lain.
NeuroXc

11

Bagi saya, entah bagaimana, definisikan default_server tidak berfungsi. Saya menyelesaikannya dengan

server_name ~^.*$

menggunakan ekspresi reguler semua.


Mencoba semua opsi yang dipilih lebih tinggi dan ini adalah satu-satunya yang berhasil. CATATAN: Saya mencoba masuk ke server dengan alamat IP vs. URL-nya.
Mampersat

9

Hanya 1 serverdirektif

Dari Nginx listenDocs

Parameter default_server, jika ada, akan menyebabkan server menjadi server default untuk alamat yang ditentukan: pasangan port. Jika tidak ada arahan yang memiliki parameter default_server maka server pertama dengan alamat: pasangan port akan menjadi server default untuk pasangan ini.

Jika Anda hanya memiliki 1 serverdirektif, itu akan menangani semua permintaan, Anda tidak perlu mengatur apapun.


Beberapa serverdirektif

Jika Anda ingin mencocokkan semua permintaan dengan serverdirektif yang ditentukan , cukup tambahkan default_serverparameter ke listen, Nginx akan menggunakan serverarahan ini sebagai default.

server {
    listen 80 default_server;
}

Tentang server_name _;

Dari Nginx Docs

Dalam contoh server penampung semua, nama aneh "_" dapat dilihat:

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

Tidak ada yang istimewa dari nama ini, ini hanyalah salah satu dari sekian banyak nama domain tidak valid yang tidak pernah bersinggungan dengan nama asli mana pun. Nama tidak valid lainnya seperti "-" dan "! @ #" Mungkin sama-sama digunakan.

Tidak peduli apa yang server_nameAnda tetapkan, itu hanyalah nama domain yang tidak valid .



2

Jika Anda juga ingin menangkap permintaan dengan Hostheader kosong (yang diizinkan di HTTP / 1.0 ), Anda dapat menggunakan regex dan kosong server_name:

server {
    listen      80;
    server_name ~. "";
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.