Как извлечь только имя файла из запроса URI

11

Я пытаюсь переписать запрос URI в зависимости от расширения файла, затем извлечь только имя файла из URI и сохранить его в другой папке. Проблема здесь не в предопределенной переменной для имени файла и доступных переменных uri, request_uriи request_filenameдаст полный URI.

server{

        set $file_folder D:/nginx-1.0.15/imageAll/;  

        location ~*+.(gif|jpg)$ { 
            try_files $uri @imgstore;
        }

        location @imgstore { 
            proxy_pass $file_folder$request_filename;
            proxy_store on;
            proxy_temp_path /nginx-1.0.15/images/;
            proxy_store_access  user:rw  group:rw  all:r;
       }
}

лучшее, что я могу сделать, это получить расширение .jpg или .gif, которое, когда я ставлю $1на место $request_filenameвот так:

location @imgstore { 
    proxy_pass $file_folder$1;
}

Итак, я хочу знать:

  1. Как получить имя файла из запроса?
  2. Это правильный способ хранения изображений из папки в другую?
Johnta
источник

Ответы:

17

Вы хотите имя файла из исходного запроса или из текущего URI (после любого внутреннего перенаправления)? Они оба возможны, используя модуль карты :

# Gets the basename of the original request
map $request_uri $request_basename {
    ~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
}

# Gets the basename of the current uri
map $uri $basename {
    ~/(?<captured_basename>[^/]*)$ $captured_basename;
}

Затем просто используйте $ request_basename или $ basename везде, где они вам нужны. Обратите внимание, что карты должны быть определены в контексте http {}, что делает их родственниками серверов {}.

kolbyjack
источник
Я хочу имя файла из текущего URI, я не думаю, что модуль карты может дать это, но я попробую,
Джонта
Я проверил это локально перед публикацией, и эта вторая карта работает (если вы используете 0.9.6+)
kolbyjack
Спасибо Kolbyjack, отличный трюк сделал свою работу, я получил имя файла и расширение.
Джонта