Configurer nginx avec plusieurs emplacements avec différents dossiers racine sur le sous-domaine

202

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 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 va test.example.com/staticapporter le fichier d'index/web/test.example.com/static

simoes
la source

Réponses:

238

Vous devez utiliser la aliasdirective 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/;
  }

}

Le wiki nginx explique mieux que moi la différence entre root et alias:

Notez qu'il peut sembler similaire à la directive racine à première vue, mais la racine du document ne change pas, juste le chemin du système de fichiers utilisé pour la demande. La partie emplacement de la demande est supprimée dans les problèmes de demande Nginx.

Notez que rootet aliasgérez les barres obliques de fin différemment.

furq
la source
67
Il n'en a pas besoin alias. Veuillez lire les documents officiels , pas le wiki de la communauté rempli par les utilisateurs. Quote: Lorsque l'emplacement correspond à la dernière partie de la valeur de la directive, il est préférable d'utiliser la directive racine .
VBart
9
Cela a fonctionné pour moi, sauf qu'il manque une barre oblique. L'alias doit se lire: alias /web/test.example.com/static/;
ajma
8
@VBart les documents disent exactement ce que vous leur dites, mais ils ne justifient pas du tout cette instruction - cela semble être un choix de style arbitraire. Voyez-vous une raison logique derrière cela?
Mark Amery
104

Le système de directive de localisation est

Comme vous voulez transmettre toutes les demandes qui commencent /staticet vos données présentes dans/var/www/static

Donc, une méthode simple est séparée du dernier dossier du chemin complet, cela signifie

Chemin complet : /var/www/static

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

location <lastPath> {
    root <FirstPath>;
}

Permet donc de voir ce que vous avez fait et quelles sont vos solutions

Ton erreur :

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

Vos solutions:

location /static {
    root /web/test.example.com;
}
Kernelv5
la source
2
Cela m'a aidé: m'a fait réaliser que je devais renommer mon dossier ou créer un lien symbolique pour que les choses fonctionnent.
cjm
3
merci beaucoup,
j'échouais
10
Cela ressemble à une limitation plutôt GRAVE de la liberté de faire ce que je veux. Je veux que les URI commençant par un certain chemin soient servis à partir d'un répertoire qui ne contient pas ce chemin URI dans son chemin de fichier physique. Avec cette solution, je suis obligé de mettre mes documents sur disque sous un chemin qui se termine par "/ statique". Je n'aime pas ça du tout. Je veux une liberté absolue et complète de placer les fichiers où je veux.
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
la source
2
quelle est la différence avec demandé?
TangMonk
5
@Wooden la différence: root /web/test.example.com;au lieu de root /web/test.example.com/static;. nginx mappe le chemin spécifié par emplacement à l'arborescence du répertoire et puisque le chemin et le répertoire source partagent le même nom, il fonctionne avec root.
rmoestl