วิธีแยกเฉพาะชื่อไฟล์จากคำร้องขอ 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. มันเป็นวิธีที่ถูกต้องในการจัดเก็บภาพจากโฟลเดอร์หนึ่งไปอีกอันหนึ่งหรือไม่?

คำตอบ:


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 {} ทำให้เป็นพี่น้องกันของเซิร์ฟเวอร์ {} s


ฉันต้องการชื่อไฟล์จาก uri ปัจจุบันฉันไม่คิดว่าโมดูลแผนที่สามารถให้สิ่งนั้นได้ แต่ฉันจะลอง
Johnta

ฉันทดสอบในพื้นที่ก่อนโพสต์และแผนที่ที่สองนั้นทำงานได้ (ตราบใดที่คุณใช้ 0.9.6+)
kolbyjack

ขอบคุณ Kolbyjack ซึ่งเป็นกลอุบายที่ยอดเยี่ยมที่ได้ทำงานฉันได้รับชื่อไฟล์และนามสกุล
Johnta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.