Nginx имя_сервера-сервера или catch-all

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

До сих пор я пробовал установку server_name на *, но это не удалось как недопустимый шаблон. *.* работает до тех пор, пока я не добавлю другие серверные блоки, тогда я думаю, что он конфликтует с ними.

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

N.B. Я не спамер, это настоящие сайты с полезным контентом, они просто оснащены одной и той же CMS из базы данных!

Ответ 1

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

listen       80  default_server;

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

try_files                       $uri /$uri /index.php;

Ответ 3

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

server_name ~^(.+)$

Ответ 4

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

server_name ~^.*$

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

Ответ 5

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

С Nginx listen Docs

Параметр default_server, если он присутствует, приведет к тому, что сервер станет сервером по умолчанию для указанной пары адрес: порт. Если ни одна из директив не имеет параметра default_server, то первый сервер с парой адрес: порт будет сервером по умолчанию для этой пары.

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

Ответ 6

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

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

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

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

Ответ 7

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

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