nginx - 将 nginx root 设置为公共(public)文件夹,同时保留 URL 中的父目录名称

标签 nginx url-rewriting

在我们的网络项目中,我们有一个名为 public 的目录。我们设置root在 nginx 配置中将此 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;
    }
}

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

但是我们如何将 URL 设置为 example.com/v1根位于/srv/nginx/example.com/v1/public ?此外,如果我们上传新版本,则应该可以通过 example.com/v2 的 URL 获取该版本。根位于/srv/nginx/example.com/v2/public无需更改配置文件。

我认为实现这一目标的一种方法是每次上传新版本时创建多个服务器 block 。但就像我说的,我不希望每次上传新版本时都更改 nginx 配置,并且有做错事情的风险。

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

最佳答案

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

避免将 try_filealias 一起使用,因为 this issue 。请参阅this caution关于 if 的使用。

关于nginx - 将 nginx root 设置为公共(public)文件夹,同时保留 URL 中的父目录名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927663/

相关文章:

c# - 如何更改 MVC4 网站的 url?

javascript - 静态网站的漂亮 URL

nginx 有时会停止

php - Nginx。拉拉维尔。如何在子文件夹中设置多个端点

c - 为什么nginx中的这段代码不会导致缓冲区溢出?

wordpress - 两个 WordPress Multisite 安装在不同的子目录中

extjs - NGINX 与 spark Java 跨源通信

nginx - 使用两个并行位置配置 nginx proxy_pass

iis - 为特定域设置 URL 重写规则

php - 将所有 PHP 请求重定向到 Nginx 重写中的路由器(Tonic Framework)