Ответьте пользовательским файлом из строки запроса или по умолчанию, если файл не существует

У меня есть сервер nginx, на котором работает одностраничное приложение, простые вещи:

server{
    server_name testing001.example.com;

    location / {
      root /var/www/testing001;
      try_files $uri /index.html;
    }
}

Внутри моего каталога /var/www/testing001, помимо файлов приложения, у меня есть каталог:

\runtimes
\runtimes\1.js
\runtimes\2.js
\runtimes\3.js
...
\runtimes\default.js

Я хочу, чтобы все запросы https://testing.example.com/theRuntime.js?id = {1,2,3,4}:

  • предоставить мне соответствующий файл, в зависимости от строки запроса идентификатора
    • это работает нормально, используя:
location ~* ^/theRuntime\.js {
        if ($arg_id != "") {
            set $id $arg_id;
            rewrite ^ /runtimes/$id.js last;
        }
    }
  • если файл /runtimes/$id.js не существует, я хочу использовать /runtimes/default.js или даже просто общую строку непосредственно из nginx, мне все равно
    • Это та часть, которую я не могу понять, я пробовал много комбинаций, и он либо перестает предоставлять мне какой-либо файл (404), либо, в некоторых случаях, по умолчанию используется корень index.html
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
server{
    server_name testing001.example.com;
    root /var/www/testing001;

    location / {
        try_files $uri /index.html;
    }
    location = /theRuntime.js {
        try_files /runtimes/$arg_id.js /runtimes/default.js =404;
    }
}

Переместите root в блок server так, чтобы он обслуживал оба блока location.

Вам необходимо сопоставить один URL-адрес, поэтому используется синтаксис местоположения «точное совпадение».

Аргумент id доступен как $arg_id.

try_files проверит наличие нескольких путей под /var/www/testing001 по порядку.

Финал =404 никогда не достигается. См. try_files

Спасибо. Удивительно просто и работает как шарм

André Alçada Padez 08.05.2024 09:53

Другие вопросы по теме