web-dev-qa-db-ja.com

nginxは、URLで.jsonを指定しない限り、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がリクエストされたときにlocalhost:8080/v1/healthcheckを提供したいと思います。ただし、localhost:8080/v1/healthcheck.jsonを明示的にヒットしていない場合、nginxはjsonファイルの提供を拒否します。それ以外の場合は、ログファイルが見つからず、応答はnginxの404ページです。 URLの最後に.jsonを追加すると、ファイルが魔法のように見つかり、素晴らしい魔法が起こります。 application/jsonタイプを強制し、try files行を変更して、返したいファイルを明示的に返すようにしたので(try_files healthcheck.json =404;を設定したため)、すべて同じ問題が返されます。

私はかなり迷っています。誰かアイデアはありますか?

4
ran

これは実際には、この構成で予想される動作です。つまり、あなたがやっていることは、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;

    }
3
esoroka