280 votes

Configurer nginx avec des emplacements multiples avec des dossiers racine différents sur un sous-domaine

Je cherche à servir l'url racine d'un sous-domaine et le répertoire d'un sous-domaine à deux dossiers différents sur mon serveur. Voici la configuration simple que j'ai et qui ne fonctionne pas...

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

Dans cet exemple, aller à test.example.com/ apporterait le fichier d'index dans /web/test.example.com/www

et aller à test.example.com/static apporterait le fichier d'index dans /web/test.example.com/static

317voto

furq Points 1925

Vous devez utiliser le alias pour 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/;
  }

}

El wiki nginx explique mieux que moi la différence entre racine et alias :

Notez que cela peut ressembler à la directive Root à première vue, mais la racine du document ne change pas, juste le chemin du système de fichiers utilisé pour la requête. La partie localisation de la requête est abandonnée dans la requête émise par Nginx.

Notez que root y alias gèrent différemment les barres obliques de fin de ligne.

140voto

Kernelv5 Points 1220

Le système de directives de localisation est

Par exemple, vous voulez transmettre toutes les demandes qui commencent /static et vos données présentes dans /var/www/static

Une méthode simple consiste à séparer le dernier dossier du chemin complet, ce qui signifie que

Chemin complet : /var/www/static

Dernier chemin : /static et Premier chemin : /var/www

location <lastPath> {
    root <FirstPath>;
}

Voyons donc ce que vous avez fait d'incorrect et quelles sont vos solutions.

Votre erreur :

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

Vos solutions :

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

61voto

VBart Points 5960
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;
    }
}

https://nginx.org/en/docs/http/ngx_http_core_module.html#Root

15voto

ermenkoff Points 573

Un exemple un peu plus élaboré.

Mise en place : Vous avez un site web à example.com et vous avez une application web à example.com/webapp

...
server {
  listen 443 ssl;
  server_name example.com;

  root   /usr/share/nginx/html/website_dir;
  index  index.html index.htm;
  try_files $uri $uri/ /index.html;

  location /webapp/ {
    alias  /usr/share/nginx/html/webapp_dir/;
    index  index.html index.htm;
    try_files $uri $uri/ /webapp/index.html;
  }
}
...

J'ai nommé webapp_dir y website_dir à dessein. Si vous avez des noms et des dossiers correspondants, vous pouvez utiliser la fonction root directive.

Cette configuration fonctionne et est testée avec Docker.

NB ! !! Faites attention aux barres obliques. Mettez-les exactement comme dans l'exemple.

1voto

Si vous l'utilisez, je vous suggère de configurer également cette commande.

location /static/ {
    proxy_set_header Host $host/static; // if you change the directory and the browser can't find your path
    alias /web/test.example.com/static/;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X