除非在 URL 中指定 .json,否则 nginx 不会提供 json 文件

除非在 URL 中指定 .json,否则 nginx 不会提供 json 文件

我有以下 nginx.conf 文件:

server {
    listen 8080;
    server_name dummy_server;

    root /usr/share/nginx/html;

    location / {
      if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
      }

      default_type 'application/json';
      add_header 'Access-Control-Allow-Origin' '*' always;
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
      add_header 'Content-Type' 'application/json';
      if ($request_uri ~* "([^/]*$)" ) {
        set  $last_path_component  $1;
      }

      try_files $last_path_component.json $last_path_component.json =404;
    }
  }

我希望在请求healthcheck.json时提供服务。但是,如果我没有明确点击,nginx 会拒绝提供任何 json 文件,否则它会记录文件未找到,并且响应是 nginx 的 404 页面。如果我在 url 末尾添加 .json,则会神奇地找到该文件,然后发生伟大的奇迹。我尝试强制类型,以及更改行以明确返回我想要返回的文件(所以我设置了),所有这些都返回了相同的问题。localhost:8080/v1/healthchecklocalhost:8080/v1/healthcheck.jsonapplication/jsontry filestry_files healthcheck.json =404;

我很迷茫......有人有什么想法吗?

答案1

这实际上是此配置的预期行为。因此,您要做的就是删除 URL,然后将其传递给try_files
但是 中没有任何内容try_files可以处理没有扩展名的文件。为此,请像这样修改它

try_files $last_path_component $last_path_component.json $last_path_component.json =404;

这将允许您提供.json不带扩展名的文件。然而,这将不会提供.json带或不带扩展名的相同文件。该try_files指令检查文件是否存在并按此顺序提供它们。因此,如果您有healthcheck.json并尝试通过它访问它,localhost:8080/v1/healthcheck它仍然会失败。因此,您需要让healthcheck端点实际上在服务器上没有扩展名才能访问它。

如果您想处理这两种变体(带或不带扩展),您可能需要.json先像这样剥离部分

    if ($request_uri ~ ^/([^?]*)\.json(\?.*)?$) {
         return 302 /$1$2;
    }

    try_files $uri $uri.json =404;

    }

相关内容