web-dev-qa-db-fra.com

nginx ne servira pas le fichier json sauf si vous spécifiez .json dans l'url

J'ai le fichier nginx.conf suivant:

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;
    }
  }

Je voudrais servir healthcheck.json quand localhost:8080/v1/healthcheck Est demandé. Cependant, nginx refuse de servir tout fichier json si je ne frappe pas explicitement localhost:8080/v1/healthcheck.json, sinon il enregistre le fichier introuvable et la réponse est la page 404 de nginx. Si j'ajoute .json à la fin de l'url, le fichier est trouvé comme par magie et une grande magie opère. J'ai essayé de forcer application/json type, ainsi que la modification du try files row pour renvoyer explicitement le fichier que je voudrais retourner (j'ai donc défini try_files healthcheck.json =404;) tous renvoie le même problème.

Je suis assez perdu .. quelqu'un a des idées?

4
ran

Il s'agit en fait d'un comportement attendu avec cette configuration. Donc, ce que vous faites, c'est supprimer l'URL puis la passer à try_files.
Mais il n'y a rien dans try_files pour gérer les fichiers sans extension. Pour ce faire, modifiez-le comme ceci

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

Cela vous permettra de servir .json fichiers sans extension. Cependant, cela ne servira pas la même chose .json fichier avec ou sans extension. Le try_files directive vérifie l'existence des fichiers et les sert dans cet ordre. Donc, si vous avez healthcheck.json et essayez d'y accéder via localhost:8080/v1/healthcheckil échouera toujours. Vous devez donc avoir healthcheck end-point pour être réellement sans extension sur le serveur pour qu'il soit accessible.

Si vous souhaitez gérer les deux variantes, avec ou sans extension, vous pouvez supprimer le .json première partie comme celle-ci

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

    try_files $uri $uri.json =404;

    }
3
esoroka