Назад | Перейти на главную страницу

nginx не будет обслуживать файл json, если в URL-адресе не указано .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 запрашивается. Однако nginx отказывается обслуживать любой файл json, если я не нажимаю явно localhost:8080/v1/healthcheck.json, в противном случае он регистрирует, что файл не найден, и ответом будет страница 404 nginx. Если я добавлю .json в конец URL-адреса, файл будет найден волшебным образом, и произойдет великая магия. Я пытался заставить application/json тип, а также изменение try files row, чтобы явно вернуть файл, который я хотел бы вернуть (поэтому я установил try_files healthcheck.json =404;) все возвращает одну и ту же проблему.

Я совсем потерялся .. У кого-нибудь есть идеи?

На самом деле это ожидаемое поведение с этой конфигурацией. Итак, что вы делаете, это удаляет 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;

    }