2017-08-08 3 views
1

J'ai passé muy tiempo à ce sujet et je ne peux pas obtenir une solution. J'ai besoin d'un moyen de pointer la même URL mais avec un répertoire racine différent pour la même application. Je ne veux pas utiliser de réécriture car le nom de rootoy root doit être traité par l'application et la réécriture le supprime.alias nginx et les noms de répertoires dynamiques

http://www.host.com/a/ --> /var/www/html/project/ 
http://www.host.com/b/ --> /var/www/html/project/ 
http://www.host.com/c/ --> /var/www/html/project/ 

J'ai réussi à configurer dans nginx un répertoire alias avec un fixe nom vdirectory et faire nginx transmet la demande à FastCGI.

location /vdirectory { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /vdirectory/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

Ce qui précède fonctionne correctement.

Depuis que je ne veux pas utiliser des noms de répertoire racine fixe, mais les arbitraires, ce que je suis parvenu à ce jour:

location ~ ^/(.?)$ { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /$1/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

Inutile de dire, il retourne 404. Il est un bon signe car cela signifie que regex a reconnu le chemin, mais la requête n'est pas transmise correctement.

La seule différence entre la configuration de travail et le mauvais est /vdirectory vs ~ ^/(.?)$

Répondre

2

alias fonctionne différemment lorsque dans une expression régulière location bloc. Voir this document pour plus de détails. Vous devrez capturer le reste de l'URI et l'ajouter à la valeur alias. Par exemple:

location ~ ^/(?<prefix>[^/]+)/(?<name>.*)$ { 
    alias /var/www/html/project/$name; 

    if (!-e $request_filename) { rewrite^/$prefix/index.php last; } 

    location ~ \.php$ { 
     if (!-f $request_filename) { return 404; } 

     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     include fastcgi_params;      
     fastcgi_param SCRIPT_FILENAME $request_filename; 
    } 
} 

J'évite d'utiliser try_files et alias dans le même bloc en raison de long term issues. Voir this caution sur l'utilisation de if.

+0

Oui. C'est ce que je cherchais. C'est tellement rare d'avoir une solution aussi précise. Merci un million –