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

时间:2017-10-25 08:34:55

标签: nginx url-rewriting

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

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

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

现在我们可以通过网址srv/nginx/example.com/v1/public访问example.com了。大。

但是,如何将我们的网址设置为example.com/v1,其根目录为/srv/nginx/example.com/v1/public?此外,如果我们上传新版本,则应该通过example.com/v2的网址提供,其根目录为/srv/nginx/example.com/v2/public而不更改配置文件。

我认为我可以实现这一目标的一种方法是每次上传新版本时都会生成多个服务器块。但就像我说的那样,每次我们上传新版本并且冒着做错事的风险时,我都不希望改变nginx配置。

还有其他方法吗?我该如何使用这些?

1 个答案:

答案 0 :(得分:1)

使用regular expression location block将URI拆分为两个组件,并使用alias directive构建目标文件的路径(由$request_filename variable表示)。

例如:

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

由于this issue,请避免将try_filealias一起使用。有关使用if的信息,请参阅this caution