nginx nazwa_serwera wildcard lub catch-all

119

Mam uruchomioną instancję nginx, która obsługuje kilka witryn internetowych. Pierwsza to komunikat o stanie na adresie IP serwera. Drugi to konsola administratora admin.domain.com. Te działają świetnie. Teraz chciałbym, aby wszystkie inne żądania domeny trafiały do ​​jednej index.php- mam mnóstwo domen i subdomen, a ich lista jest niepraktyczna w konfiguracji nginx.

Do tej pory próbowałem ustawienie server_namesię *jednak, że nie powiodła się nieprawidłowym zamiennika. *.*działa, dopóki nie dodam innych bloków serwera, więc myślę, że to z nimi koliduje.

Czy istnieje sposób na uruchomienie bloku serwera typu catch-all w nginx po zdefiniowaniu innych witryn?

Uwaga: nie jestem spamerem, to są autentyczne strony z użyteczną treścią, są one po prostu zasilane przez ten sam CMS z bazy danych!

Tak
źródło
1
Najlepiej używać tego jako głównego źródła nginx.org/en/docs/http/server_names.html
stephen

Odpowiedzi:

147

Zmień opcję nasłuchiwania na tę w swoim bloku serwera catch-all. (Dodaj default_server) to zajmie wszystkie niezdefiniowane połączenia (na określonym porcie).

listen       80  default_server;

jeśli chcesz przesłać wszystko do index.php, jeśli plik lub folder nie istnieje;

try_files                       $uri /$uri /index.php;
Mattias
źródło
Działało doskonale - wielkie dzięki. Nie mogłem użyć server_name _;strony stanu adresu IP, musiałem określić, server_name x.x.x.xale to jest w porządku!
Tak,
1
Dodawanie default_serverwydaje się nie działać na nginx 1.4.6, który jest obecnie najnowszą wersją na Ubuntu 14.04 ... Kiedy dodam, configtestpolecenie zwraca błąd, a ponowne uruchomienie serwera również nie działa. Wypróbowałem dokładnie tę samą konfigurację na moim serwerze z Debian jessie, która ma nginx 1.6.2 i działa doskonale. Więc wypróbuj inną wersję, jeśli korzystasz z 1.4.6 ...
Nicomak,
1
Uwaga dodatkowa dotycząca protokołu HTTPS: default_serverdyrektywa określa również serwer, który będzie obsługiwał uzgadnianie SSL dla żądań na tym porcie. Tak więc, jeśli chcesz, aby blok serwera A obsługiwał SSL, ale serwer B działał jako punkt zaczepienia dla HTTPS, rozwiązaniem jest ustawienie server_name ~^(.+)$na serwerze B.
Łukasz
66

Prosty podkreślenie też działa:

server_name  _;

Źródło: http://nginx.org/en/docs/http/server_names.html

jp.gouigoux
źródło
2
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Kmeixner
10
Link służy tylko jako odniesienie. Dwie powyższe linie są w rzeczywistości odpowiedzią: po prostu wstawienie podkreślenia jako wartości dla nazwa_serwera spowoduje pożądane zachowanie "złap wszystko".
jp.gouigoux
55
Ta odpowiedź nie jest prawdziwa. Odniesienie wyjaśnia, że ​​to nie zadziała, chyba że masz również listen 80 default_serverw swojej konfiguracji.
Beetle
5
Zobacz także ten artykuł .
Beetle
2
Może źle zrozumiałem dokumentację, ale „Nie ma nic specjalnego w tej nazwie, jest to tylko jedna z wielu nieprawidłowych nazw domen, które nigdy nie przecinają się z żadną prawdziwą nazwą. Inne nieprawidłowe nazwy, takie jak„ - ”i„! @ # ”Mogą być również używane. ”. Czy _to tylko nieprawidłowa nazwa?
Florian Klein,
26

To zadziała:

server_name ~^(.+)$
comonitos
źródło
13
server_name ~.wydaje się być bardziej wydajne
youfu
2
To zadziałało dla mnie. Z jakiegoś powodu nie mogłem uruchomić default_server, przesłaniał on wszystkie moje inne vhosty.
NeuroXc
11

U mnie jakoś zdefiniowanie default_server nie działało. Rozwiązałem to przez

server_name ~^.*$

używając wyrażenia regularnego all.

Ashish
źródło
Wypróbowałem wszystkie opcje, które uzyskały wyższą liczbę głosów i jako jedyne zadziałały. UWAGA: próbuję dostać się do serwera z jego adresem IP a adresem URL.
Mampersat
9

Tylko 1 serverdyrektywa

Z Nginx listenDocs

Parametr default_server, jeśli jest obecny, spowoduje, że serwer stanie się domyślnym serwerem dla określonej pary adres: port. Jeśli żadna z dyrektyw nie ma parametru default_server, to pierwszy serwer z parą adres: port będzie domyślnym serwerem dla tej pary.

Jeśli masz tylko jedną serverdyrektywę, która obsłuży wszystkie żądania, nie musisz niczego ustawiać.


serverDyrektywa wielokrotna

Jeśli chcesz dopasować wszystkie żądania z określoną serverdyrektywą, po prostu dodaj default_serverparametr do listen, Nginx użyje tej serverdyrektywy jako domyślnej.

server {
    listen 80 default_server;
}

O server_name _;

Z Nginx Docs

W przykładach serwerów typu catch-all można zobaczyć dziwną nazwę „_”:

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

Nie ma nic specjalnego w tej nazwie, jest to tylko jedna z wielu nieprawidłowych nazw domen, które nigdy nie przecinają się z żadną prawdziwą nazwą. Inne nieprawidłowe nazwy, takie jak „-” i „! @ #”, Mogą być również używane.

Nie ma znaczenia, co server_nameustawisz, jest to po prostu nieprawidłowa nazwa domeny .

Steely Wing
źródło
2

Jeśli chcesz również przechwytywać żądania z pustym Hostnagłówkiem (co jest dozwolone w HTTP / 1.0 ), możesz użyć zarówno wyrażenia regularnego, jak i pustego server_name:

server {
    listen      80;
    server_name ~. "";
}
Pavel Golubev
źródło