Skonfiguruj nginx z wieloma lokalizacjami z różnymi folderami głównymi w subdomenie

202

Chcę podać główny adres URL subdomeny i katalogu subdomeny do dwóch różnych folderów na moim serwerze. Oto prosta konfiguracja, którą mam i nie działa ...

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;
    }
}

W tym przykładzie zamiar test.example.com/przyniósłby plik indeksu/web/test.example.com/www

i zamiar test.example.com/staticprzyniesie plik indeksu/web/test.example.com/static

simoes
źródło

Odpowiedzi:

238

Musisz użyć tej aliasdyrektywy do 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 wiki wyjaśnia różnicę pomiędzy root i alias lepiej niż ja:

Zauważ, że na pierwszy rzut oka może wyglądać podobnie do dyrektywy root, ale katalog główny dokumentu się nie zmienia, tylko ścieżka systemu plików użyta dla żądania. Część lokalizacji żądania jest usuwana w problemach Nginx żądania.

Zauważ, że rooti aliasradzisz sobie z końcowymi ukośnikami inaczej.

furq
źródło
67
On nie potrzebuje alias. Przeczytaj oficjalne dokumenty , a nie wiki społeczności wypełnione przez użytkowników. Cytat: Gdy lokalizacja odpowiada ostatniej części wartości dyrektywy, lepiej użyć dyrektywy głównej .
VBart
9
To działało dla mnie z tym wyjątkiem, że brakuje końcowego ukośnika. Alias ​​powinien brzmieć: alias /web/test.example.com/static/;
ajma
8
@VBart doktorzy mówią dokładnie to, co ich cytujesz, ale wcale nie uzasadniają tej instrukcji - wydaje się, że to wybór w dowolnym stylu. Czy widzisz za tym jakiś logiczny powód?
Mark Amery
104

System dyrektywy lokalizacji to

Jak chcesz przesłać wszystkie żądania, które się rozpoczynają /statici Twoje dane są w nim zawarte/var/www/static

Oznacza to, że prosta metoda jest oddzielana ostatni folder od pełnej ścieżki, co oznacza

Pełna ścieżka : /var/www/static

Ostatnia ścieżka: /static i pierwsza ścieżka:/var/www

location <lastPath> {
    root <FirstPath>;
}

Zobaczmy więc, co pomyliłeś i jakie są twoje rozwiązania

Twój błąd :

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

Twoje rozwiązania:

location /static {
    root /web/test.example.com;
}
Jądro5
źródło
2
Pomogło mi to: uświadomiłem sobie, że muszę zmienić nazwę folderu lub skonfigurować dowiązanie symboliczne, aby wszystko działało.
cjm,
3
dziękuję bardzo,
zawiodłem
10
Wygląda to na dość POWAŻNE ograniczenie swobody robienia tego, co chcę. Chcę, aby identyfikatory URI zaczynające się od określonej ścieżki były podawane z katalogu, który nie zawiera tej ścieżki URI w fizycznej ścieżce pliku. Dzięki temu rozwiązaniu MUSZĘ umieścić moje dokumenty na dysku pod ścieżką, która kończy się na „/ static”. W ogóle mi się to nie podoba. Chcę absolutnej i pełnej swobody umieszczania plików w dowolnym miejscu.
Szczepan Hołyszewski
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
źródło
2
czym różni się pytanie?
TangMonk,
5
@ Drewniana różnica: root /web/test.example.com;zamiast root /web/test.example.com/static;. nginx mapuje ścieżkę określoną przez lokalizację do drzewa katalogu, a ponieważ ścieżka i katalog źródłowy mają tę samą nazwę, to działa z root.
rmoestl