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;
Ответ 2
Также выполняется простое подчеркивание:
server_name _;
Источник: http://nginx.org/en/docs/http/server_names.html
Ответ 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 ~. "";
}