Підстановочне прізвище nginx сервера або загальний код


119

У мене є екземпляр запущеного nginx, який обслуговує кілька веб-сайтів. Перше - це повідомлення про статус IP-адреси сервера. Другий - консоль адміністратора на admin.domain.com. Вони чудово працюють. Тепер я хотів би, щоб усі інші запити домену перейшли до єдиного index.php- у мене є безліч доменів і піддоменів, і перераховувати їх у конфігурації nginx недоцільно.

До сих пір я спробував встановити server_nameв *але це не вдалося , як неприпустимий шаблон. *.*працює, поки я не додаю інші серверні блоки, то, мабуть, це суперечить їм.

Чи є спосіб запустити загальноприйнятий блок сервера в nginx після того, як інші сайти були визначені?

Примітка: Я не спамер, це справжні сайти з корисним вмістом, вони просто працюють на тій же CMS з бази даних!


1
Краще за все, щоб використовувати це в якості основного джерела nginx.org/en/docs/http/server_names.html
Стівену

Відповіді:


147

Змініть параметр прослуховування цього у вашому блоці серверів. (Додати default_server) це займе всі ваші не визначені з'єднання (на вказаному порту).

listen       80  default_server;

якщо ви хочете підштовхнути все до index.php, якщо файл або папка не існує;

try_files                       $uri /$uri /index.php;

Працювали прекрасно - велике спасибі. Я не зміг використати server_name _;для сторінки статусу IP-адресу, мені довелося вказати, server_name x.x.x.xале це нормально!
Tak

1
Додавання, default_serverздається, не працює на nginx 1.4.6, який наразі є останньою версією Ubuntu 14.04 ... Коли я додаю його, configtestкоманда повертає помилку, і перезапуск сервера також не працює. Я спробував саме такий конфігурацію на своєму сервері з Debian jessie, у якого є nginx 1.6.2, і він працює чудово. Тож спробуйте іншу версію, якщо ви на 1.4.6 ...
Нікомак

1
Бічна примітка для HTTPS: default_serverдиректива також встановлює сервер, який буде обробляти SSL рукостискання для запитів на цьому порту. Отже, якщо ви хочете, щоб серверний блок A обробляв SSL, але сервер B виконував роль каталізатора для HTTPS, рішення - встановити server_name ~^(.+)$на сервері B.
Лука

66

Простий підкреслення також працює:

server_name  _;

Джерело: http://nginx.org/en/docs/http/server_names.html


2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Кмейкснер

10
Посилання просто надається в якості посилання. Два вище рядки насправді є відповіддю: просто встановлення підкреслення як значення для імені_сервера призведе до потрібної поведінки «зловити всіх».
jp.gouigoux

55
Ця відповідь не відповідає дійсності. У посиланні чітко видно, що це не буде працювати, якщо ви також не будете мати listen 80 default_serverконфігурацію.
Жук

5
Також дивіться цю статтю .
Жук

2
Можливо, я неправильно зрозумів документи, але "Нічого особливого в цьому імені немає, це лише одна з безлічі недійсних доменних імен, які ніколи не перетинаються з жодним реальним іменем. Інші недійсні імена на кшталт" - "і"! @ # "Можуть однаково використовуються. ". Так _це просто невірне ім’я?
Флоріан Кляйн

26

Це спрацює:

server_name ~^(.+)$

13
server_name ~.здається, ефективніше
youfu

2
Це працювало для мене. З будь-якої причини я не міг змусити сервера default_server працювати, це було перекриттям всіх моїх інших пристрастей.
NeuroXc

11

Для мене якось визначити default_server не працює. Я вирішив це шляхом

server_name ~^.*$

використовуючи регулярне вираження всіх.


Перепробував усі вищі варіанти голосування, і це єдиний, хто працював. ПРИМІТКА. Я намагаюся потрапити на сервер із його IP-адресою та URL-адресою.
Mampersat

9

Лише 1 serverдиректива

Від Документів Nginxlisten

Параметр default_server, якщо він присутній, призведе до того, що сервер стане сервером за замовчуванням для вказаної пари: порт порту. Якщо жодна з директив не має параметра default_server, то перший сервер з адресою: пара портів буде сервером за замовчуванням для цієї пари.

Якщо у вас є лише 1 serverдиректива, яка буде обробляти всі запити, вам нічого не потрібно встановлювати.


Кілька serverдиректив

Якщо ви хочете зіставити весь запит із заданою serverдирективою, просто додайте default_serverпараметр до listen, Nginx використовуватиме цю serverдирективу як стандартну.

server {
    listen 80 default_server;
}

Про server_name _;

Від Документів Nginx

На прикладах сервера catch-all видно дивне ім'я "_":

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

У цьому імені немає нічого особливого, це лише одне з безлічі недійсних доменних імен, які ніколи не перетинаються з реальним іменем. Інші недійсні назви, такі як "-" та "! @ #", Однаково можуть використовуватися.

Не має значення, що server_nameви встановили, це просто недійсне доменне ім’я .



2

Якщо ви також хочете ловити запити з порожнім Hostзаголовком (що дозволено в HTTP / 1.0 ), ви можете використовувати як регулярний, так і порожній server_name:

server {
    listen      80;
    server_name ~. "";
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.