nginx имя_сервера подстановочный знак или универсальный


119

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

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

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

NB Я не спамер, это настоящие сайты с полезным контентом, просто они работают на одной и той же 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 ...
Nicomak

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
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится.
Kmeixner

10
Ссылка предназначена только для справки. Две приведенные выше строки и являются ответом: простое подчеркивание в качестве значения для server_name приведет к желаемому поведению "поймать все".
jp.gouigoux

55
Это неверный ответ. Ссылка дает понять, что это не сработает, если вы также не listen 80 default_serverукажете в своей config.
Beetle

5
Также смотрите эту статью .
Beetle

2
Возможно, я неправильно понял документацию, но «В этом имени нет ничего особенного, это всего лишь одно из множества недопустимых доменных имен, которые никогда не пересекаются с каким-либо настоящим именем. Другие недопустимые имена, такие как« - »и«! @ # »Могут одинаково использоваться. ". Так _это просто неверное имя?
Флориан Кляйн

26

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

server_name ~^(.+)$

13
server_name ~.кажется более эффективным
youfu

2
Это сработало для меня. По какой-то причине я не мог заставить работать default_server, он перекрывал все мои другие хосты.
NeuroXc

11

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

server_name ~^.*$

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


Пробовал все варианты, за которые проголосовали выше, и это единственный, который сработал. ПРИМЕЧАНИЕ. Я пытаюсь получить доступ к серверу с его 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

В примерах серверов для приема всей почты домена можно увидеть странное имя «_»:

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.