可以在两个单独的块中定义单个nginx位置吗?

时间:2017-04-07 16:02:01

标签: nginx

是否可以在两个单独的块中定义单个nginx位置?

例如:

server {
  listen *:80;
  server_name someserver;

  location / {
    proxy_cache off;
  }

  location /assets {
    proxy_cache mycache;
  }

  # What do I need to do to get this second root location
  # to append to the 1st? If it's even possible.
  location / {
    proxy_pass http://foo;
  }
}

这个想法是根位置有效地成为:

location / {
  proxy_cache off;
  proxy_pass http://foo;
}

如果您想了解有关 why 的更多信息,请继续阅读。

背景:

我正在运行GitLab Omnibus安装。根据{{​​3}},管理员将自定义nginx配置注入GitLab服务器块。

但是,此注入会将内容添加到终端服务器块而不是特定的位置块。

因此,如果我尝试注入include my_config.conf;,我会得到:

server {
  listen *:80;
  server_name someserver;

  location / {
    proxy_cache off;
  }

  location /assets {
    proxy_cache mycache;
  }

  include my_config.conf;
}

如果我尝试包含location ^~ / {\n include my_config.conf;\n }\n,我会得到:

server {
  listen *:80;
  server_name someserver;

  location / {
    proxy_cache off;
  }

  location /assets {
    proxy_cache mycache;
  }

  location ^~ / {
    include my_config.conf;
  }
}

然后导致nginx配置失败并出现duplicate location "/" in /var/opt/gitlab/nginx/conf/gitlab-http.conf:106错误。

注意: my_config.conf包含CORS的add_header内容,因此需要docs

1 个答案:

答案 0 :(得分:1)

您可能需要了解nginx processes a request的方式。但位置块添加,必须单独完成。您可以在server块中放置某些语句,并允许各个location块根据需要覆盖(例如proxy_cache)。

假设您的所有URI都已被代理,您可以使用以下内容:

proxy_cache off;

location / {
    proxy_pass http://foo;
}
location /assets {
    proxy_cache mycache;
    proxy_pass http://foo;
}

可以将常用语句卸载到include文件。