ตำแหน่งที่ซ้อนกัน nginx


60

ฉันมีปัญหาในการทำความเข้าใจตำแหน่งที่ซ้อนกันใน nginx ฉันมีสองสถานที่ที่มีคำสั่งกำหนดค่าเหมือนกันดังนั้นแทนที่จะทำซ้ำคำสั่งฉันต้องการทำซ้ำ URI โดยใช้นิพจน์ปกติ:

location ~ /a|/b {
        location /a {
        }
        location /b {
        }
}

อย่างไรก็ตามสิ่งนี้ทำให้เกิดข้อผิดพลาด

nginx: [emerg] location "/a" is outside location "/a|/b" in /etc/nginx/nginx.conf:36

ไม่มีหรือ|ดูเหมือนว่าโอเค

location ~ /a {
        location /a {
        }
}

ผมทำอะไรผิดหรือเปล่า? มีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ทำซ้ำอะไรเลย? ฉันสามารถจัดกลุ่มสถานที่ด้วยวิธีอื่นได้หรือไม่?


1
ทำไมจัดกลุ่มพวกเขา ทำไมไม่เพียงแค่จูบ
pkhamre


6
เพราะเหตุผลพวกมันถูกจัดกลุ่ม
Jayen

สิ่งนี้ใช้เวลานานในการทำความเข้าใจ แต่ในที่สุดฉันก็สามารถสร้างรายการลำดับความสำคัญแบบง่าย (ish) เกี่ยวกับวิธีเลือกสถานที่
artfulrobot

คำตอบ:


101

คำถามเก่า แต่ปัญหาเกิดขึ้นเนื่องจากที่ตั้งหลักคือที่ตั้ง regex ในขณะที่ที่ตั้งซ้อนกันเป็นที่ตั้งของคำนำหน้า

คุณสามารถกำหนดที่ตั้งนำหน้าแบบซ้อนได้เมื่อตำแหน่งหลักเป็นตำแหน่งนำหน้าด้วย:

location /a {
        location /a {
               # You can also skip this location and just write
               # your code directly under the parent location
        }
        location /a/b {
        ...
        }
}

เมื่อตำแหน่งหลักถูกกำหนดโดย regex ตำแหน่งที่ซ้อนกันใด ๆ จะต้องถูกกำหนดโดย regexes ด้วย:

location ~ ^/(a|b) {
        location ~ ^/a {
        ...
        }
        location ~ ^/b {
        ...
        }
}

อย่างไรก็ตามคุณอาจกำหนดตำแหน่ง regex ที่ซ้อนกันได้เมื่อตำแหน่งพาเรนต์เป็นตำแหน่งนำหน้า:

location /a/b {
        location ~ /a {
        ...
        }
        location ~ /b {
        ...
        }
}

ฉันสับสนโดยประโยคแรกของคุณ แต่ตัวอย่างของคุณสมเหตุสมผล ฉันถือว่าในตัวอย่างสุดท้ายที่ตั้งคำนำหน้า/bจะโยนข้อผิดพลาด?
Jayen

13
ว่าประโยคแรกควรจะอยู่ในเอกสาร
AndreKR

1
ในตัวอย่างแรกถ้าคุณปล่อยให้location /a { }สำเร็จรูป - การสั่งซื้อมีความสำคัญหรือไม่?
Meekohi

2
อาไม่เป็นไรฉันเข้าใจผิด ตำแหน่งที่ซ้อนกันจะไม่ได้รับมรดกใด ๆ จากที่ตั้งหลัก
Meekohi

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