Configure o nginx com vários locais com diferentes pastas raiz no subdomínio

202

Estou procurando servir o URL raiz de um subdomínio e o diretório de um subdomínio para duas pastas diferentes no meu servidor. Aqui está a configuração simples que tenho e não está funcionando ...

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

Neste exemplo test.example.com/, traria o arquivo de índice em/web/test.example.com/www

e vai test.example.com/statictrazer o arquivo de índice em/web/test.example.com/static

simoes
fonte

Respostas:

238

Você precisa usar a aliasdiretiva para 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/;
  }

}

O wiki do nginx explica a diferença entre raiz e alias melhor do que eu:

Observe que pode parecer semelhante à diretiva raiz à primeira vista, mas a raiz do documento não muda, apenas o caminho do sistema de arquivos usado para a solicitação. A parte do local da solicitação é descartada nos problemas de solicitação do Nginx.

Observe que roote aliasmanipule as barras finais de maneira diferente.

furq
fonte
67
Ele não precisa alias. Leia os documentos oficiais , não o wiki da comunidade preenchido pelos usuários. Citação: Quando o local corresponde à última parte do valor da diretiva, é melhor usar a diretiva raiz .
Vbart
9
Isso funcionou para mim, exceto que está faltando uma barra final. O alias deve ser: alias /web/test.example.com/static/;
ajma
8
@VBart, os documentos dizem exatamente o que você citou, mas eles não justificam essa instrução - parece uma escolha de estilo arbitrário. Você vê alguma razão lógica por trás disso?
Marque Amery
104

O sistema de diretiva Location é

Como você deseja encaminhar todas as solicitações iniciadas /statice seus dados presentes em/var/www/static

Portanto, um método simples é separado da última pasta do caminho completo, o que significa

Caminho completo : /var/www/static

Último caminho: /static e Primeiro caminho:/var/www

location <lastPath> {
    root <FirstPath>;
}

Então vamos ver o que você cometeu e quais são suas soluções

O seu erro :

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

Suas soluções:

location /static {
    root /web/test.example.com;
}
Kernelv5
fonte
2
Isso me ajudou: me fez perceber que eu precisava renomear minha pasta ou configurar um link simbólico para fazer as coisas funcionarem.
Cjm 19/10/19
3
muito obrigado, eu estava falhando exatamente dessa forma :)
bobmoff
10
Parece uma limitação bastante GRAVE na liberdade de fazer o que eu quero. Quero que URIs iniciados com um determinado caminho sejam atendidos a partir de um diretório que não contém esse caminho no caminho físico do arquivo. Com esta solução, sou forçado a colocar meus documentos em disco sob um caminho que termina com "/ static". Eu não gosto disso. Quero absoluta e completa liberdade de colocar os arquivos onde quiser.
Szczepan Hołyszewski 5/05/19
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
fonte
2
qual é a diferença com perguntou?
TangMonk
5
@ Madeira a diferença: em root /web/test.example.com;vez de root /web/test.example.com/static;. O nginx mapeia o caminho especificado por localização para a árvore de diretórios e, como o caminho e o diretório de origem compartilham o mesmo nome, ele trabalha com ele root.
precisa saber é o seguinte