15 votes

Nginx racines multiples

J'aimerais détourner les demandes d'accès à un sous-répertoire particulier vers un autre emplacement racine. Comment ? Mon bloc existant est :

server {
    listen       80;
    server_name  www.domain.com;

    location / {
        root   /home/me/Documents/site1;
        index  index.html;
    }

    location /petproject {
        root   /home/me/pet-Project/website;
        index  index.html;
        rewrite ^/petproject(.*)$ /$1;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    } }

C'est-à-dire, http://www.domain.com devrait servir /home/me/Documents/site1/index.html alors que http://www.domain.com/petproject devrait servir /home/me/pet-Project/website/index.html -- il semble que nginx réexécute toutes les règles après le remplacement, et que http://www.domain.com/petproject sert juste /home/me/Documents/site1/index.html .

32voto

Tero Kilkanen Points 32968

La configuration présente le problème habituel qui se produit généralement avec nginx. C'est-à-dire que l'utilisation de root dans la directive location bloc.

Essayez d'utiliser cette configuration à la place de votre configuration actuelle location blocs :

root /home/me/Documents/site1;
index index.html;

location /petproject {
    alias /home/me/pet-Project/website;
}

Cela signifie que le répertoire par défaut pour votre site web est /home/me/Documents/site1 et pour /petproject URI, le contenu est servi à partir de /home/me/pet-Project/website répertoire.

2 votes

Quel est le problème habituel auquel vous faites référence et pourquoi l'alias est-il meilleur ? la documentation de nginx donne un exemple utilisant deux racines

4 votes

Le problème habituel est que les gens ne réalisent pas comment root y location les blocs interagissent. Avec root nginx ajoute le chemin après la directive location au bloc root dir pour obtenir le chemin complet du système de fichiers vers le fichier. Par conséquent, si le chemin spécifié dans location n'existe pas dans le répertoire spécifié par root , quelque chose d'inattendu pour l'utilisateur se produit.

4voto

user241548 Points 11

Vous avez besoin de la break ajouté à la règle de réécriture, de sorte que le traitement s'arrête, et comme il se trouve à l'intérieur d'un bloc d'emplacement, le traitement se poursuivra à l'intérieur de ce bloc :

rewrite ^/petproject/?(.*)$ /$1 break;

Notez que j'ai également ajouté /? au modèle de correspondance afin de ne pas se retrouver avec des doubles slashs au début de l'url.

0 votes

La réécriture n'est pas du tout nécessaire ici lorsque alias est utilisée comme elle devrait l'être ici.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X