如何仅从请求uri中提取文件名


11

我正在尝试根据文件的扩展名重写请求uri,然后仅从uri中提取文件名并将其存储在另一个文件夹中。这里的问题是没有预定义的文件名变量和可用变量urirequest_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. 将图像从文件夹存储到另一个文件夹是否正确?

Answers:


17

您要从原始请求还是从当前uri(在进行任何内部重定向之后)获得文件名?它们都可以使用map模块

# 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 {}上下文中定义映射,从而使它们成为server {}的兄弟。


我想要当前uri中的文件名,我不认为map模块可以做到这一点,但我会尝试一下,
Johnta 2012年

我在发布之前在本地对其进行了测试,并且第二张地图有效(只要您使用的是0.9.6+)
kolbyjack 2012年

谢谢Kolbyjack,这很成功,我得到了文件名和扩展名。
约翰塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.