подстановочный знак nginx server_name или универсальный - PullRequest
97 голосов
/ 26 февраля 2012

У меня запущен экземпляр nginx, который обслуживает несколько сайтов.Первое - это сообщение о состоянии на IP-адресе сервера.Второй - консоль администратора на admin.domain.com.Это прекрасно работает.Теперь я хотел бы, чтобы все другие запросы к домену направлялись на один index.php - у меня есть множество доменов и поддоменов, и нецелесообразно перечислять их все в конфигурации nginx.server_name до *, но это неверный подстановочный знак.*.* работает до тех пор, пока я не добавлю другие серверные блоки, тогда, я думаю, это конфликтует с ними.

Есть ли способ запустить универсальный серверный блок в nginx после определения других сайтов?

NB Я не спамер, это подлинные сайты с полезным контентом, они просто работают на той же CMS из базы данных!

Ответы [ 7 ]

129 голосов
/ 26 февраля 2012

Измените параметр прослушивания на это в своем блоке перехвата сервера.(Добавьте default_server), это займет все ваши неопределенные соединения (на указанном порту).

listen       80  default_server;

, если вы хотите отправить все в index.php, если файл или папка не существует;

try_files                       $uri /$uri /index.php;
49 голосов
/ 08 мая 2015

Также работает простое подчеркивание:

server_name  _;

Источник: http://nginx.org/en/docs/http/server_names.html

22 голосов
/ 15 октября 2014

Это будет работать:

server_name ~^(.+)$
7 голосов
/ 08 апреля 2016

Для меня как-то определить default_server не работает. Я решил это

server_name ~^.*$

с использованием регулярного выражения всего.

2 голосов
/ 12 октября 2018

Теперь вы можете использовать маску:

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

Смотрите больше здесь: http://nginx.org/en/docs/http/server_names.html

2 голосов
/ 20 июля 2018

Только 1 server директива

С Nginx listen Документы

Параметр 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 вы установили, это просто неверное доменное имя .

1 голос
/ 25 января 2019

Если вы также хотите перехватывать запросы с пустым заголовком Host (что разрешено в HTTP / 1.0 ), вы можете использовать как регулярное выражение, так и пустое server_name:

server {
    listen      80;
    server_name ~. "";
}
...