สัญลักษณ์ตัวแทน / regex ในพา ธ ตำแหน่ง


22

config Nginx ฉันมี 404 .phpเช่น:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

อย่างไรก็ตามฉันมีไฟล์ index.php อยู่ในโฟลเดอร์ย่อยที่ฉันต้องการเรียกใช้ การกำหนดค่าปัจจุบันมีลักษณะดังนี้:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

มันทำงานได้อย่างสมบูรณ์ แต่ปัญหาคือสถานที่ที่ซ้ำกันและหากมีหน้าย่อยมากมายการกำหนดค่าจะกลายเป็นเรื่องใหญ่

ฉันลองใช้ไวด์การ์ดเช่น * และบาง regex ซึ่งระบุว่าผ่านการทดสอบ nginx แต่ไม่โหลดหน้าเว็บเช่น 404 สิ่งที่ฉันลองคือ:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

มีวิธีใดบ้างที่ฉันสามารถมีชื่อพา ธ ในตำแหน่งเป็น regex หรือไวด์การ์ด

คำตอบ:


32

โมดิ=ฟายเออร์ในlocationบล็อกเป็นการจับคู่ที่ตรงกันโดยไม่มีอักขระตัวแทนการจับคู่คำนำหน้าหรือนิพจน์ทั่วไป นั่นเป็นเหตุผลที่มันไม่ทำงาน

ในความพยายาม regex ของคุณ[a-z]ตรงกับตัวอักษรตัวเดียวระหว่างและa zนั่นเป็นเหตุผลที่มันไม่ทำงานสำหรับคุณ

คุณต้องตั้งค่าตำแหน่งของคุณดังต่อไปนี้ หมายเหตุลำดับของlocationงบ nginx เลือกเงื่อนไขการจับคู่ regex แรก

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

ฉันใช้การจับคู่แบบตรงตาม~ตัวพิมพ์เล็กและใหญ่ที่นี่ ( ตัวดัดแปลงแทน~*) ในกรณีแรกผมตรงส่วนแรกของเส้นทางแล้วหนึ่งหรือจำนวนมากของตัวละคร / index.phpจำนวนตัวอักษรแล้ว คุณสามารถปรับเปลี่ยนช่วงการแข่งขัน แต่จำไว้ว่าการ+ทำซ้ำ "หนึ่งหรือมากกว่า"

คนที่สองตรงกับ URI ใด ๆ .phpที่ลงท้ายด้วย คุณไม่ต้องการอักขระพิเศษในเวอร์ชันของคุณเนื่องจากวิธีการทำงานของนิพจน์ทั่วไป


ขอบคุณใช่การทำซ้ำสิ่งสำคัญหายไปจาก regex +ซ่อมมัน.

1

คำสั่งซื้อมีความสำคัญจากคำอธิบาย "สถานที่" ของ nginx :

ในการค้นหาตำแหน่งที่ตรงกับคำขอที่ได้รับ nginx ก่อนตรวจสอบสถานที่ที่กำหนดโดยใช้สตริงคำนำหน้า (ตำแหน่งคำนำหน้า) ในหมู่พวกเขาสถานที่ที่มีคำนำหน้าการจับคู่ที่ยาวที่สุดจะถูกเลือกและจดจำ จากนั้นตรวจสอบนิพจน์ทั่วไปตามลำดับที่ปรากฏในไฟล์กำหนดค่า การค้นหานิพจน์ทั่วไปสิ้นสุดลงในการแข่งขันนัดแรกและใช้การกำหนดค่าที่เกี่ยวข้อง หากไม่พบการจับคู่กับนิพจน์ทั่วไปการกำหนดค่าของตำแหน่งคำนำหน้าที่จดจำไว้ก่อนหน้านี้จะถูกใช้

มันหมายถึง:

  • ก่อน=อื่น (การจับคู่ "คำนำหน้าการจับคู่ที่ยาวที่สุด")
  • จากนั้นก็บอกเป็นนัย (การจับคู่ "คำนำหน้าการจับคู่ที่ยาวที่สุด")
  • จากนั้น regex (นัดแรก)

คุณต้องปรับลำดับของชิ้นส่วน regex

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