nginx 别名和动态目录名称

Vik*_*ras 1 alias nginx

我在这方面花了很多时间,但找不到解决方案。我需要一种方法将相同的 url 但具有不同的根目录指向同一个应用程序。我不想使用重写,因为应用程序必须处理根目录名称,重写会丢弃它。

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/
Run Code Online (Sandbox Code Playgroud)

我设法在 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;
      }
}
Run Code Online (Sandbox Code Playgroud)

以上工作正常。

由于我不想使用固定的根目录名称,而是使用任意的名称,这是我到目前为止所管理的:

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;
      }
}
Run Code Online (Sandbox Code Playgroud)

不用说,它返回 404。这是一个好兆头,因为这意味着 regex 已识别路径,但请求未正确转发。

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

Ric*_*ith 6

alias在正则表达式location块中的工作方式不同。有关详细信息,请参阅此文档。您需要捕获 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于长期问题,我避免在同一块内使用try_files和。见这种谨慎的使用。aliasif