2012-02-26 11 views
68

Mam instancję działającą na nginxie, która obsługuje kilka stron internetowych. Pierwszym z nich jest komunikat o statusie na adresie IP serwera. Druga to konsola administracyjna pod numerem admin.domain.com. Działają świetnie. Teraz chciałbym, aby wszystkie inne żądania domeny przechodziły do ​​pojedynczego index.php - Mam mnóstwo domen i subdomen i niepraktyczne jest ich lista w konfiguracji nginx.nginx nazwa_serwera - wildcard lub catch-all

Do tej pory próbowałem ustawić server_name na *, ale to się nie udało jako nieważny symbol wieloznaczny. *.* działa, dopóki nie dodaję innych bloków serwera, wtedy domyślam się, że to powoduje konflikt z nimi.

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

N.B. Nie jestem spamerem, są to autentyczne strony z przydatnymi treściami, są zasilane przez ten sam CMS z bazy danych!

Odpowiedz

101

Zmienić opcję słuchania w bloku serwera typu catch-all. (Dodaj default_server) to zajmie wszystkie twoje niezdefiniowane połączenia (na określonym porcie).

listen  80 default_server; 

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

try_files      $uri /$uri /index.php; 
+0

Działa doskonale - wielkie dzięki. Nie mogłem użyć 'nazwa_serwera _;' dla strony statusu na adresie IP, musiałem podać 'nazwa_serwera x.x.x.x', ale to jest w porządku! – Tak

+0

Dodanie 'default_server' nie działa na Nginx 1.4.6, który jest obecnie najnowszą wersją na Ubuntu 14.04 ... Kiedy dodam to, komenda' configtest' zwraca błąd, a zrestartowanie serwera nie działa zarówno. Próbowałem dokładnie tej samej konfiguracji na moim serwerze z Debian jessie, który ma nginx 1.6.2 i działa idealnie. Więc wypróbuj inną wersję, jeśli jesteś na 1.4.6 ... – Nicomak

+0

Nota boczna dla HTTPS: dyrektywa '' 'default_server''' ustawia 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 catchall dla HTTPS, rozwiązaniem jest ustawienie '' nazwa_serwera ~^(. +) $ '' 'Na serwerze B. – Luke

19

to będzie działać:

server_name ~^(.+)$ 
+6

' nazwa_serwera ~ . "Wydaje się być bardziej skuteczny – zhangyoufu

+1

To zadziałało dla mnie. Z jakiegokolwiek powodu nie mogłem dostać default_server do pracy, było to nadrzędne dla wszystkich moich innych vhostów. – NeuroXc

34

Prosty podkreślenia działa tak samo:

server_name _; 

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

+0

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać odnośnik. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. – Kmeixner

+6

Łącze jest podane jako odniesienie. Dwa powyższe wiersze stanowią odpowiedź: wprowadzenie podkreślenia jako wartości nazwa_serwera spowoduje pożądane zachowanie "złap wszystko". –

+25

Ta odpowiedź jest nieprawdziwa. Odsyłacz wyjaśnia, że ​​to nie zadziała, chyba że masz również 'listen 80 default_server' w swojej konfiguracji. – Beetle

3

Dla mnie jakoś zdefiniować default_server nie działa. Rozwiązałem go przez

server_name ~^.*$ 

używając wyrażeń regularnych wszystkich.

+0

Wypróbowałem wszystkie wyżej wybrane opcje głosowania i jest to jedyna, która zadziałała. UWAGA: Próbuję dostać się do serwera z jego adresem IP w stosunku do adresu URL. – Mampersat

Powiązane problemy