【问题标题】:How can I serve nested projects in Nginx如何在 Nginx 中为嵌套项目提供服务
【发布时间】:2018-01-17 10:31:22
【问题描述】:

我有一个 Lumen api 项目,其中包含多个用于 api 版本控制的 git 标签。所以我必须部署项目的多个结帐。

服务器上的文件夹结构如下:

var
   www
     api-staging
       master
         v1
           public
             index.php
           ...
         v2
           public
             index.php
           ...
         lastest
            public
              index.php
            ...
         ...

现在我想通过 nginx 为项目提供服务,以便 url 看起来像这样。

http://BRANCH.domain.tld/VERSION/ 例如。 http://master.domain.tld/lastest/

我尝试了很多正则表达式,但没有任何效果。我希望你能帮助我。

【问题讨论】:

  • 只需为每个文件夹结构设置不同的虚拟主机。
  • @Suraj 我想防止这种情况发生。此外,由于分支数量众多,这是不可能的。

标签: regex git laravel nginx lumen


【解决方案1】:

您需要使用正则表达式server_name 语句来捕获BRANCH。请参阅this document 了解更多信息。

通过将/public 附加到捕获的VERSION 来构造根,这需要正则表达式locationalias 语句。请参阅this document 了解更多信息。

例如:

server {
    ...
    server_name  ~^(?<branch>.+)\.domain\.tld$;

    location ~ ^/(?<version>[^/]+)/(?<name>.*)$ {

        alias /var/www/api-staging/$branch$version/public/$name;

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

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

【讨论】:

  • 如果版本号是通过请求标头而不是服务器 url 域传递的,有没有办法做到这一点?
  • 当然。请求标头的值可通过$http_ 系列变量获得。可以在alias 语句中使用适当的变量。
猜你喜欢
  • 2015-12-03
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多