nginx server_name joker karakteri veya tümünü yakalama


119

Birkaç web sitesine hizmet veren çalışan bir nginx örneğim var. İlki, sunucunun IP adresindeki bir durum mesajıdır. İkincisi, bir yönetici konsoludur admin.domain.com. Bunlar harika çalışıyor. Şimdi diğer tüm etki alanı isteklerinin tek bir alana gitmesini istiyorum - bir index.phpsürü etki alanım ve alt etki alanım var ve hepsini bir nginx yapılandırmasında listelemek pratik değil.

Şimdiye kadar ayarlamayı denedim server_name, *ancak bu geçersiz bir joker karakter olarak başarısız oldu. *.*diğer sunucu bloklarını ekleyene kadar çalışıyor, sonra sanırım onlarla çakışıyor.

Diğer siteler tanımlandıktan sonra nginx'te tümünü yakalama sunucu bloğu çalıştırmanın bir yolu var mı?

NB Spam gönderen değilim, bunlar yararlı içeriğe sahip gerçek siteler, sadece bir veritabanından aynı CMS tarafından destekleniyorlar!


1
Bunu birincil kaynak olarak kullanmak en iyisi nginx.org/en/docs/http/server_names.html
stephen

Yanıtlar:


147

Tümünü yakalama sunucu bloğunuzda dinleme seçeneğini buna değiştirin. (Ekle default_server) bu, tanımlanmamış tüm bağlantılarınızı alır (belirtilen bağlantı noktasında).

listen       80  default_server;

dosya veya klasör yoksa her şeyi index.php'ye göndermek istiyorsanız;

try_files                       $uri /$uri /index.php;

Mükemmel çalıştı - çok teşekkürler. server_name _;IP adresindeki durum sayfası için kullanamadım , belirtmek zorunda kaldım server_name x.x.x.xama sorun değil!
Tak

1
Ekleme default_server, şu anda Ubuntu 14.04'teki en son sürüm olan nginx 1.4.6 üzerinde çalışmıyor gibi görünüyor ... Eklediğimde configtestkomut bir hata veriyor ve sunucuyu yeniden başlatmak da çalışmıyor. Nginx 1.6.2'ye sahip Debian jessie ile sunucumda tam olarak aynı yapılandırmayı denedim ve mükemmel çalışıyor. 1.4.6 üzerindeyseniz başka bir sürümü deneyin ...
Nicomak

1
HTTPS için ek not: default_serveryönerge aynı zamanda bu bağlantı noktasındaki istekler için SSL anlaşmasını işleyecek sunucuyu da belirler. Öyleyse, sunucu bloğu A'nın SSL'yi işlemesini, ancak sunucu B'nin HTTPS için yakalama görevi görmesini istiyorsanız, çözüm, server_name ~^(.+)$sunucu B'yi ayarlamaktır .
Luke

66

Basit bir alt çizgi de işe yarar:

server_name  _;

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


2
Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz hale gelebilir.
Kmeixner

10
Bağlantı sadece referans olarak verilmiştir. Yukarıdaki iki satır aslında cevaptır: sunucu_adı için bir değer olarak bir alt çizgi koymak istenen "tümünü yakala" davranışını üretecektir.
jp.gouigoux

55
Bu cevap doğru değil. Referans, listen 80 default_serveryapılandırmanızda da yoksa bunun çalışmayacağını açıkça ortaya koymaktadır .
Beetle


2
Belki dokümanları yanlış anladım, ancak "Bu adla ilgili özel bir şey yok, hiçbir zaman gerçek adla kesişmeyen sayısız geçersiz alan adından biri." - "ve"! @ # "Gibi diğer geçersiz adlar olabilir eşit olarak kullanılabilir. " Yani _sadece geçersiz bir isim mi?
Florian Klein

26

Bu çalışacak:

server_name ~^(.+)$

13
server_name ~.daha verimli görünüyor
youfu

2
Bu benim için çalıştı. Her ne sebeple olursa olsun default_server'ı çalıştıramadım, diğer tüm sankonlarımı geçersiz kılıyordu.
NeuroXc

11

Benim için bir şekilde tanımla default_server çalışmıyordu. Ben çözdüm

server_name ~^.*$

hepsinin düzenli ifadesini kullanarak.


Tüm yüksek oylu seçenekleri denedim ve işe yarayan tek seçenek bu. NOT: IP adresi ve URL'si olan bir sunucuya ulaşmaya çalışıyorum.
Mampersat

9

Sadece 1 serveryönerge

Gönderen Nginx listenDokümanlar

Default_server parametresi, eğer varsa, sunucunun belirtilen adres: port çifti için varsayılan sunucu olmasına neden olur. Yönergelerin hiçbirinde default_server parametresi yoksa, adres: port çiftine sahip ilk sunucu bu çift için varsayılan sunucu olacaktır.

Yalnızca tek bir serverdirektifiniz varsa, tüm talepleri karşılayacak, hiçbir şey ayarlamanıza gerek yoktur.


Çoklu serveryönerge

Tüm istekleri belirtilen serveryönergeyle eşleştirmek istiyorsanız , sadece default_serverparametresini ekleyin listen, Nginx bu serveryönergeyi varsayılan olarak kullanacaktır .

server {
    listen 80 default_server;
}

hakkında server_name _;

Gönderen Nginx Dokümanlar

Tümünü yakalama sunucu örneklerinde garip “_” adı görülebilir:

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

Bu adla ilgili özel bir şey yoktur, hiçbir zaman gerçek adla kesişmeyen sayısız geçersiz alan adından biridir. "-" ve "! @ #" Gibi diğer geçersiz adlar da aynı şekilde kullanılabilir.

Ne server_nameayarladığınız önemli değil, sadece geçersiz bir alan adıdır .



2

Ayrıca boş Hostbaşlık içeren istekleri yakalamak istiyorsanız ( HTTP / 1.0'da izin verilir ) hem normal ifadeyi hem de boş olanı kullanabilirsiniz server_name:

server {
    listen      80;
    server_name ~. "";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.