Сконфигурируйте nginx в нескольких местах с разными корневыми папками на поддомене.

202

Я ищу, чтобы корневой URL субдомена и каталог субдомена находились в двух разных папках на моем сервере. Вот простая настройка, которая у меня есть и не работает ...

server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
            root /web/test.example.com/www;
    }

    location /static {
            root /web/test.example.com/static;
    }
}

В этом примере test.example.com/будет приведен файл индекса в/web/test.example.com/www

и собирается test.example.com/staticпринести файл индекса в/web/test.example.com/static

Simoes
источник

Ответы:

238

Вам необходимо использовать aliasдирективу для location /static:

server {

  index index.html;
  server_name test.example.com;

  root /web/test.example.com/www;

  location /static/ {
    alias /web/test.example.com/static/;
  }

}

Nginx вики объясняет разницу между корнем и псевдонимом лучше , чем я могу:

Обратите внимание, что на первый взгляд она может выглядеть аналогично корневой директиве, но корень документа не меняется, а только путь файловой системы, используемый для запроса. Часть местоположения запроса отбрасывается в запросе Nginx.

Обратите внимание, что rootи aliasобрабатывать косые черты по-разному.

Фуркан
источник
67
Ему не нужно alias. Пожалуйста, прочитайте официальные документы , а не вики сообщества, заполненные пользователями. Цитата: Когда location соответствует последней части значения директивы, лучше использовать корневую директиву .
VBart
9
Это сработало для меня, за исключением того, что в нем отсутствует косая черта. Псевдоним должен выглядеть так: alias /web/test.example.com/static/;
Аджма
8
@VBart документы действительно говорят то, что вы цитируете, но они совсем не оправдывают эту инструкцию - это похоже на произвольный выбор стиля. Вы видите какую-то логическую причину этого?
Марк Амери
104

Система директив местоположения

Как вы хотите переслать весь запрос, который начинается, /staticи ваши данные присутствуют в/var/www/static

Таким образом, простой метод отделяет последнюю папку от полного пути, что означает

Полный путь : /var/www/static

Последний путь: /static и Первый путь:/var/www

location <lastPath> {
    root <FirstPath>;
}

Итак, давайте посмотрим, в чем вы ошиблись и каковы ваши решения

Ваша ошибка :

location /static {
    root /web/test.example.com/static;
}

Ваши решения:

location /static {
    root /web/test.example.com;
}
Kernelv5
источник
2
Это помогло мне: заставило меня осознать, что мне нужно либо переименовать папку, либо создать символическую ссылку, чтобы все заработало.
CJM
3
большое спасибо, я
терпел
10
Это выглядит как довольно серьезное ограничение свободы делать то, что я хочу. Я хочу, чтобы URI, начинающиеся с определенного пути, обслуживались из каталога, который не содержит этот путь URI в своем физическом пути к файлу. Благодаря этому решению я вынужден поместить свои документы на диск по пути, который заканчивается на «/ static». Мне это совсем не нравится. Я хочу абсолютной и полной свободы размещения файлов, где я хочу.
Щепан Холышевский
48
server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
        root /web/test.example.com/www;
    }

    location /static {
        root /web/test.example.com;
    }
}

http://nginx.org/r/root

VBart
источник
2
в чем разница с вопросом?
TangMonk
5
@ Разница была: root /web/test.example.com;вместо root /web/test.example.com/static;. nginx отображает путь, указанный в location, в дерево директорий, и, поскольку путь и исходный каталог имеют одно и то же имя, он работает с ним root.
rmoestl