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

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.


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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.