Как установить корневой путь nginx на основе хоста

Как установить корневой путь nginx на основе хоста

Как настроить хост посетителя на использование определенного корневого пути в 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блоков; приведенный выше фрагмент должен работать как есть, но я ничего не гарантирую, поскольку не тестировал его.

Связанный контент