NGINX: map และ try_files ไม่ทำงาน

Oct 08 2020

ฉันใช้ nginx เพื่อตรวจหาการรองรับ webp ในเบราว์เซอร์:

# Check if client is capable of handling webp
map $http_accept $webp_suffix {
       default "";
       "~*webp" ".webp";
}

รหัสนี้ใช้ได้และกำหนด. webp ให้กับ $ webp_suffix เมื่อไคลเอนต์สนับสนุนรูปภาพ / webp

จากนั้นไม่กี่บรรทัดต่อมาฉันใช้ตัวแปรนี้ในการกำหนดค่าต่อไปนี้:

        location ~ ^/imgs/([0-9]*)/(.*?)(\..+)$ {
                add_header X-webp $webp_suffix; try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;
        }

และส่งผลให้ e404 เสมอแม้ว่าทั้งสองไฟล์จะมีอยู่ก็ตาม ส่วนหัว X-webp ตั้งค่าเป็น ".webp" เพื่อให้แผนที่ทำงานได้ดี

อะไรจะแปลกไปกว่านั้น - ถ้าฉันสลับลำดับของอาร์กิวเมนต์ try_files จาก:

try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;

ถึง

try_files /imgs/$1$3 /imgs/$1$webp_suffix =404;

จากนั้นมันจะทำงานและส่งไฟล์ / imgs / $ 1 $ 3 ไปยังเบราว์เซอร์ มันเป็นไปได้ยังไงกัน ? ฉันขาดอะไรบางอย่างในตรรกะนี้หรือไม่?

แก้ไข 1: กรอก nginx.conf เพื่อทำซ้ำ:

events {
    use           epoll;
    worker_connections  128;
}

http {

    # Check if client is capable of handling webp
    map $http_accept $webp_suffix { default ""; "~*webp" ".webp"; } server { listen *:8888; server_name test; root /srv; location ~ ^/imgs/([0-9]*)/(.*?)(\..+)$ {
                    add_header X-webp $webp_suffix; try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;
            }

    }
}

EDIT2: อะไรจะแปลกไปกว่านั้น - ถ้าฉันเปลี่ยน:

try_files /imgs/$1$webp_suffix /imgs/$1$3 =404;

ถึง:

try_files /imgs/$1.webp /imgs/$1$3 =404;

จากนั้น try_files ใช้งานได้ตามที่คาดไว้ (แต่ตอนนี้เราไม่ได้ตรวจสอบการรองรับ webp ในไคลเอนต์เพียงสมมติว่ารองรับ) โปรดจำไว้ว่า:

add_header X-webp $webp_suffix;

ในตำแหน่งเดียวกันผลลัพธ์ในส่วนหัวที่เพิ่ม: X-webp .webp

แล้วทำไม / imgs / $ 1$webp_suffix does not work and /imgs/$1.webp ทำงาน?

สิ่งที่ฉันได้ทดสอบ:

  1. $ webp_suffix = ".webp" (ทดสอบแล้วใช้งานได้)
  2. try_files / imgs / $ 1$webp_suffix /imgs/$1 $ 3 = 404 - ไม่ทำงานและส่งคืน 404
  3. try_files /imgs/$1.webp / imgs /$1$3 = 404 - ทำงานและส่งคืนไฟล์ webp
  4. try_files / imgs /$1$3 / ภาพ /$1$webp_suffix = 404 - ทำงานและส่งคืนไฟล์ jpg

ซึ่งไม่สมเหตุสมผลเลย

แก้ไข 3:

สำหรับการทดสอบฉันกำลังเปิด: http: // test: 8888 / imgs / 10 / any.jpg

มีไฟล์ /srv/imgs/10.jpg และ /srv/imgs/10.webp

คำตอบ

7 RichardSmith Oct 08 2020 at 00:50

try_filesคำสั่งที่ใช้จับเป็นตัวเลขจากการแสดงออกปกติในlocationคำสั่ง ปัญหาเกี่ยวกับการจับตัวเลขคือการเขียนทับเมื่อใดก็ตามที่มีการประเมินนิพจน์ทั่วไป mapมีนิพจน์ปกติที่ได้รับการประเมินระหว่างlocationและtry_filesงบ

วิธีแก้ปัญหาคือการใช้ชื่อแคปเจอร์:

ตัวอย่างเช่น:

location ~ ^/imgs/(?<prefix>[0-9]*)/(.*?)(?<suffix>\..+)$ { add_header X-webp $webp_suffix;
    try_files /imgs/$prefix$webp_suffix /imgs/$prefix$suffix =404;
}