Что именно я неправильно делаю при создании пути к файлу?

Не могу понять, в чем заключается моя ошибка. Задача передо мной стоит простая: необходимо проверить наличие файла в двух папках. С прямым путем все работает нормально, но есть проблемы с резервным. Резервный файл находится по следующему пути: 
<pre><code>/public/tmp/file/original/domain/FOLDER_RANDOM/FILE.jpg</code></pre>. 

На странице объявлен GET параметр: 
<pre><code>&amp;image=https://domain.com/chunk_folder/FOLDER_RANDOM/FILE.jpg</code></pre>. 

С помощью директивы `map` я создаю переменную, которая содержит значение `FOLDER_RANDOM` и название файла: 
<pre><code class="nginx">map $arg_image $image_original_tmp_folder_name {
    default         "";
    ~\/chunk_folder\/(.*)$    "$1";
}</code></pre>. 

В конфигурации `server` у меня настроено следующее: 
<pre><code class="nginx">set $image_original_tmp /public/tmp/original/domain/;

location @original {
   try_files $image$uri $image_original_tmp$image_original_tmp_folder_name @errors
}</code></pre>. 

Тем не менее, происходит сброс на ошибку 404, хотя файл, по идее, должен находиться в папке по рассчитанному пути `$image_original_tmp$image_original_tmp_folder_name`. В чем может заключаться проблема?
  • 18 октября 2024 г. 19:22
Ответы на вопрос 2
Давайте по шагам разберем, что именно может вызывать ошибку 404 при проверке наличия файла в вашем Nginx конфигурационном файле.

1. **Проблема с синтаксисом переменных**:
   В вашем блоке `try_files` вы используете переменную `$image`, но не определяется, откуда она берется. Если она не установлена ранее в файле конфигурации, это может быть причиной проблемы. Проверьте, что вы правильно определили путь к файлу и что он соответствует ожидаемому.

2. **Правильное создание переменной `image_original_tmp_folder_name`**:
   Вы создаете переменную `image_original_tmp_folder_name` из параметра `image`, однако в паттерне вы используете `~\/chunk_folder\/(.*)$` и берете только первую часть, которая идет после `chunk_folder`. Если в параметре передан некорректный URL или нужные части отсутствуют, переменная может быть пустой. Убедитесь, что параметр `image` действительно содержит ожидаемый формат.

3. **Проверка пути к файлу**:
   Во время конфигурации строки `$image_original_tmp$image_original_tmp_folder_name`, она должна составлять полный и корректный путь к файлу. В вашем случае это будет выглядеть так:
   ```
   /public/tmp/original/domain/FOLDER_RANDOM/FILE.jpg
   ```

   Проверьте, действительно ли этот файл существует по указанному пути.

4. **Корректная работа директивы `try_files`**:
   В выражении `try_files $image$uri $image_original_tmp$image_original_tmp_folder_name @errors` вы, скорее всего, хотите проверить два пути. Убедитесь, что в этом выражении правильно прописаны переменные, которые вы хотите использовать. В текущем виде строка `$image$uri` может не выполнять нужную проверку, если переменная `$image` не определена корректно.

   Попробуйте изменить выражение на что-то вроде:
   ```nginx
   try_files $uri $image_original_tmp$image_original_tmp_folder_name @errors;
   ```

5. **Логи**:
   Включите журнал ошибок и в журнале доступа, чтобы просмотреть более детальную информацию об ошибках, которые могут помочь вам диагностировать проблему.

Пример исправления:
```nginx
map $arg_image $image_original_tmp_folder_name {
    default         "";
    ~\/chunk_folder\/(.*)$    "$1";
}

server {
    set $image_original_tmp /public/tmp/original/domain/;

    location @original {
        try_files $uri $image_original_tmp$image_original_tmp_folder_name @errors;
    }

    location @errors {
        return 404;
    }
}
```

Ваша финальная конфигурация должна корректно обрабатывать путь к файлу, если переменные определены верно и файл действительно существует по заданному пути.
Разобрался, косяк был в map, перестроил map с $uri и все заработало =)
Похожие вопросы