
Как настроить хост посетителя на использование определенного корневого пути в nginx?
Посетитель с IP 1.1.1.1 будет использовать
root /srv/web1
все остальные Посетители будут использовать
root /srv/web2
решение1
Хотя на этот вопрос легко ответить, просто проведя небольшое исследование и прочитав документацию (желательно начать сРуководство для начинающиха потомКак nginx обрабатывает запрос), я все равно отвечу.
Я предполагаю, что у вас есть сервер с несколькими сетевыми интерфейсами и IP-адресами, где адрес 1.1.1.1 назначен одному интерфейсу, а другие адреса — соответствующим интерфейсам.
Nginx очень гибок в этом отношении, на самом деле, всегда есть server
блок, который используется по умолчанию, когда nginx не может сопоставить ни один другой блок сервера по server_name
: это либо первый server
блок файла, либо тот, который указан default_server
в его listen
директиве. И помните, чтовы можете указать IP в listen
директиве.
В вашем случае это означает:
server {
listen 80 default_server;
root /srv/web2;
[...]
}
server {
listen 1.1.1.1:80;
root /srv/web1;
[...]
}
Как вы можете видеть в примере выше, первый server
блок прослушивает все интерфейсы на порту 80, тогда как второй блок прослушивает только интерфейс 1.1.1.1 на порту 80. Таким образом, любой, кто посещает ваш сайт через сетевой интерфейс 1.1.1.1, получит файлы из /srv/web1, независимо от поля Host в HTTP-запросе (то есть доменного имени, написанного в строке URL).
Аналогичное поведение можно получить, указав IP-адрес в server_name
директиве, например:
server {
listen 80;
server_name 1.1.1.1;
[...]
}
* Обратите внимание, что этот последний server
блок перехватывает только запросы к буквальному IP-адресу, а не к доменным именам.
Надеюсь, я ответил на ваш вопрос, но в следующий раз, пожалуйста, предоставьте дополнительную информацию о вашей текущей настройке и проведите небольшое исследование.
Обновлять
Чтобы получить описанное поведение, вы можете использоватьгеомодулькак объяснено вэтот вопрос:
geo $client {
default web2;
1.1.1.1 web1;
}
server {
[...]
root /srv/$client;
[...]
}
Эта конфигурация используетгеомодуль для установки переменной ( $client
) на основе IP-адреса клиента. Эта переменная устанавливается либо по умолчаниювеб2или конкретныйвеб1и затем подставляется в root
директиву.
Обратите внимание, что geo
директива должна находиться внутри http
блока, а не server
блоков; приведенный выше фрагмент должен работать как есть, но я ничего не гарантирую, поскольку не тестировал его.