Nginx sert le contenu par défaut au lieu de mon contenu

J’ai une nginx version: nginx/1.10.3 (Ubuntu) fonctionnant sur Ubuntu 16.04.2 LTS .

J’utilise nginx pour servir des fichiers statiques, des bundles générés par webpack , mais cela est sans importance.

Ce que je veux réaliser, c’est ceci:

Sur example.com je veux servir /home/bundles/main/index.html . Je peux le faire.

Sur projects.example.com/project_1 Je veux servir /home/bundles/project_1/index.html .

Sur projects.example.com/project_2 je veux servir /home/bundles/project_2/index.html .

Les deux derniers, je ne peux pas faire. Lorsque je vais sur projects.example.com/project_1 ou projects.example.com/project_2 je suis desservi par la page nginx par défaut.

Pour rendre les choses plus compliquées, /etc/nginx/sites-enabled/default est entièrement mis en commentaire.

De plus, si, dans le bloc d’ location de projects.example.com je remplace, par exemple, project_1 par / , je serai servi pour ce projet spécifique, mais je n’aurai aucun moyen de servir l’autre.

Bellow, je vais vous montrer ma configuration nginx


 server { listen 80; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } ssl_certificatee ... ssl_certificatee_key ... } server { listen 80; server_name projects.example.com; location /project_1 { root /home/bundles/project_1; try_files $uri /index.html; } location /project_2 { root /home/bundles/project_2; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name projects.example.com; location /project_1 { root /home/bundles/project_1; try_files $uri /index.html; } location /project_2 { root /home/bundles/project_2; try_files $uri /index.html; } ssl_certificatee ... ssl_certificatee_key ... } 

Merci de votre aide!


MODIFIER

Ma réponse

La solution que j’ai trouvée consistait à changer la root avec un alias .

 server { listen 80; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name example.com; location / { root /home/bundles/main; try_files $uri /index.html; } ssl_certificatee ... ssl_certificatee_key ... } server { listen 80; server_name projects.example.com; location /project_1 { alias /home/bundles/project_1; index index.html; } location /project_2 { alias /home/bundles/project_2; index index.html; } if ($scheme != "https") { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name projects.example.com; location /project_1 { alias /home/bundles/project_1; index index.html; } location /project_2 { alias /home/bundles/project_2; index index.html; } ssl_certificatee ... ssl_certificatee_key ... } 

La solution est basée sur ces deux réponses. La première réponse montrant comment résoudre le problème et la seconde réponse expliquant pourquoi l’ alias fonctionne et root ne le fait pas.

Pour citer @treecoder

Dans le cas de la directive racine, le chemin d’access complet est ajouté à la racine, y compris la partie emplacement, alors que dans le cas de la directive alias, seule la partie du chemin NON comprenant la partie emplacement est ajoutée à l’alias.

Dans mon cas particulier, cela se traduirait comme ceci;

Avec root , le chemin nginx tenterait d’accéder serait /home/bundles/project_1/project_1 .

Avec alias il accède au chemin correct, /home/bundles/project_1 .

Revenant d’un niveau, par exemple, en disant:

root /home/bundles/ n’est pas vraiment une option non plus. En effet, mes projets ne sont pas réellement appelés project_1 et project_2 . La structure actuelle est plus similaire à celle-ci.

Dans /bundles j’ai les répertoires project_a et project_b . Je souhaite router project_1 vers le répertoire project_2 et project_2 vers le répertoire project_b .

C’est pourquoi j’ai utilisé un alias .

J’espère que ça aide.

Tu as:

 location /project_1 { root /home/bundles/project_1; try_files $uri /index.html; } 

Ainsi, la root n’est définie que pour les URI commençant par /project_1 . Pour tout autre URI, la root par défaut sera utilisée.

Si vous présentez l’URI /project_1/ (avec un trailing / ), en supposant que la directive d’ index par défaut est en vigueur, nginx devrait renvoyer votre contenu /project_1/index.html .

Cependant, l’URI /project_1 n’est pas trouvé. Par conséquent, /index.html est renvoyé à la place. L’URI /index.html ne commence pas par /project_1 , donc la racine par défaut est utilisée.


Si vous souhaitez que l’URI /project_1 fonctionne comme prévu et que l’action par défaut soit d’aller dans le fichier index.html du projet, modifiez la directive try_files .

 location /project_1 { root /home/bundles/project_1; try_files $uri $uri/ /project_1/index.html; } 

Voir ce document pour plus d’informations.


Comme les deux projets partagent une racine commune, vous pouvez simplifier comme suit:

 server { listen 80; server_name projects.example.com; root /home/bundles index index.html; location /project_1 { try_files $uri $uri/ /project_1/index.html; } location /project_2 { try_files $uri $uri/ /project_2/index.html; } location / { deny all; } } 

J’ai ajouté la directive d’ index pour éviter d’utiliser la valeur par défaut (qui est la même) et un bloc d’ location pour refuser l’access aux zones en dehors des projets.