nginx别名和动态目录名称

问题描述:

我已经花了这个muy tiempo,我无法得到一个解决方案。 我需要一种方法来指向相同的url,但具有不同的根目录到同一个应用程序。我不想使用重写,因为根目录名称必须由应用程序处理,并重写丢弃它。nginx别名和动态目录名称

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/ 

我已经成功在nginx的配置有固定vdirectory一个别名目录,使Nginx的请求转发到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; 
     } 
} 

上述工作正常。

由于我不希望使用固定的根目录的名字,但是任意的,这是我到目前为止管理:

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

不用说,它会返回404这是一个好兆头因为这意味着正则表达式已经识别了路径,但请求没有正确转发。

工作配置和错误的一个之间的唯一区别是/vdirectory VS ~ ^/(.?)$

alias作品不同的正则表达式location块内部时。详情请参阅this document。您需要捕获URI的其余部分并将其附加到alias值。例如:

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

我避免使用try_filesalias相同块内由于long term issues。请参阅this caution关于使用if

+0

是的。这就是我一直在寻找的。获得如此精确的解决方案非常罕见。太感谢了 –