将nginx root设置为公用文件夹,同时将父目录名保留在URL中

将nginx root设置为公用文件夹,同时将父目录名保留在URL中,nginx,url-rewriting,Nginx,Url Rewriting,在我们的web项目中,我们有一个名为public的目录。我们将nginx配置中的root设置为这个public文件夹,这样只有public文件夹中的文件可以通过URL访问 我们的配置看起来有点像这样: server { listen 80; server_name example.com root /srv/nginx/example.com/v1/public; index index.html index.php; locati

在我们的web项目中,我们有一个名为
public
的目录。我们将nginx配置中的
root
设置为这个
public
文件夹,这样只有
public
文件夹中的文件可以通过URL访问

我们的配置看起来有点像这样:

server {
    listen       80;
    server_name  example.com

    root   /srv/nginx/example.com/v1/public;
    index  index.html index.php;

    location / {
        try_files $uri $uri/ /index.php;
        add_header Access-Control-Allow-Origin *;
    }

    location ~ \.php$ {
        fastcgi_intercept_errors on;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_pass   php-fpm;
    }
}
现在我们可以通过URL
example.com
访问
srv/nginx/example.com/v1/public
。太好了

但是,我们如何将URL设置为
example.com/v1
,根目录位于
/srv/nginx/example.com/v1/public
?此外,如果我们上传一个新版本,它应该可以通过
example.com/v2
的URL获得,根目录为
/srv/nginx/example.com/v2/public
,而不需要更改配置文件

我认为我可以实现这一点的一种方法是,每次上传新版本时制作多个服务器块。但是就像我说的,我不希望每次上传新版本时都更改nginx配置,这样会有出错的风险

还有什么其他的方法?如何使用它们呢?

使用a将URI拆分为两个组件,并使用a构建到目标文件(由表示)的路径

例如:

server {
    listen       80;
    server_name  example.com

    root   /var/empty;
    index  index.html index.php;
    add_header Access-Control-Allow-Origin *;

    location ~ ^/(?<prefix>[^/]+)/(?<suffix>.*)$ {
        alias /srv/nginx/example.com/$prefix/public/$suffix;

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

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

            fastcgi_intercept_errors on;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $request_filename;
            fastcgi_pass   php-fpm;
        }
    }
}
服务器{
听80;
server_name example.com
root/var/empty;
index.html index.php;
添加_头访问控制允许原点*;
位置~^/(?[^/]+)/(?*)${
别名/srv/nginx/example.com/$prefix/public/$suffix;
如果(!-e$request_filename){rewrite^/$prefix/index.php last;}
位置~\.php${
如果(!-f$request_filename){return 404;}
fastcgi_截获_错误开启;
包括fastcgi_参数;
fastcgi_参数脚本_文件名$request_文件名;
fastcgi_pass php fpm;
}
}
}
避免使用
try_file
alias
,原因是。请参见关于
的使用,如果