Підстановочне прізвище 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.