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
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.