相同位置的 NGINX 位置指令

NGINX location directives for the same location

我在 NGINX 后面有一个 Nexus Repository Manager OSS 3.0 运行 作为私有 docker 注册表。我的 Docker 客户(不是官方的 docker 客户)期望从 200 OK 和一个空的 JSON 字符串 {} returned =13=]。我 运行 遇到的问题是 Nexus return 是 200 OK 而是一个空字符串。

我的解决方法是让 NGINX return 一个包含空 JSON 字符串的文件,用于 /v2/ 请求和代理 /v2/* 对 Nexus 的请求。

server {
  listen               443 ssl;
  server_name          nexus.example.com;
  ssl_certificate      ssl/server.crt;
  ssl_certificate_key  ssl/server.key;

  location = /v2/ {
    root /home/ubuntu/www;
    index empty.json;
  }

  location /v2/ {
    proxy_pass                          http://localhost:5000;
    proxy_set_header  Host              $http_host;   # required for docker client's sake
    proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
  }
}

我希望它能工作,但它会将所有流量(/v2/, /v2/_catalog, /v2/myimage/manifests/latest 等)定向到 proxy_pass。我怎样才能使 /v2/ 请求转到切断 empty.json 文件的位置?

所以您在 /home/ubuntu/www/v2/empty.json 放置了一个文件?

问题是 index 指令会将 URI 重写为 /v2/empty.json,然后由 location /v2/ 块处理。

一个解决方案是创建另一个位置来匹配重写的 URI 并将其作为静态文件提供:

root /home/ubuntu/www;

location = /v2/ {
    index empty.json;
}
location = /v2/empty.json {
}

另一个解决方案是使用 error_page 指令。但是您仍然需要指定 locationroot 来处理静态文件:

location = /v2/ {
    return 405;
    error_page 405 =200 /static/empty.json;
}
location / {
    root /home/ubuntu/www;
}