nginx, обслуживающий файлы из двух разных каталогов на одном сервере

#nginx #nginx-config #nginx-location

#nginx #nginx-config #nginx-расположение

Вопрос:

У меня следующая структура каталогов в файловой системе моего веб-сервера:

 -srv
  ---someDir
 |    ---mySite
  ---someOtherDir
      ---yourSite
  

Оба, mySite и yourSite , должны быть доступны с одного и того же nginx веб-сервера в разных каталогах (путь в адресной строке браузера), например

http://myServer/mySite и

http://myServer/yourSite

Я пытался иметь одну server запись в конфигурации с двумя location блоками (с различными настройками), но ни один из них не дал ожидаемого результата — ни с корневой записью «уровня сервера», ни без. Например (nginx.conf):

 http {
    ...
    server {
        root /srv/;
        location = /mySite {
            root /srv/someDir/mySite/;
    }
}
  

Как я уже сказал, все с разными комбинациями root и try_files т. Д.

Я подумал, что должно быть возможно иметь что-то вроде

 ...
server {
    location = /mySite {
        root /srv/someDir/mySite/;
    }

    location = /yourSite {
        root /srv/someDir/yourSite/;
    }
}
  

Где моя ошибка?

Ответ №1:

Самое простое решение — это когда у вас есть полный контроль над файловой системой и пространствами имен URI, так что приложение in /path/to/root/foo/index.html доступно с помощью URI /foo/ , а приложение in /path/to/root/bar/index.html доступно с помощью URI /bar/ .

В этом случае location блоки не нужны, а значение root имеет /path/to/root значение, потому что путь к файлу создается путем объединения этого значения с URI. Подробности см. В этом документе.

Например:

 server {
    server_name example.com;
    root /path/to/root;
}
  

Вышеупомянутый серверный блок оштрафует application foo at http://example.com/foo/ и application bar at http://example.com/bar/ .


В случае, когда элемент каталога верхнего уровня имеет имя, отличное от имени элемента URI верхнего уровня, вам нужно будет использовать alias директиву внутри location блока. Подробности см. В этом документе.

Например:

 server {
    server_name example.com;

    location /foo/ {
        alias /path/to/foos/directory/;
    }
    location /bar/ {
        alias /path/to/bars/directory/;
    }
}
  

И location значение, и alias значение должны заканчиваться на / , или ни одно из них не должно заканчиваться на / .

Обратите внимание, что location директива используется без = оператора, который используется только для сопоставления с одним URI. Подробности см. В этом документе.

Комментарии:

1. Я не понимаю первый пример, поскольку у меня может быть только одна root запись в server блоке, как это будет работать с двумя приложениями? Однако сработал второй пример (после настройки base href элемента в моем html). Спасибо, что предоставили мне решение 🙂

2. Если два приложения используют один и тот же общий корень, вам понадобится только один root оператор, который указывает на родительский каталог.