vị trí lồng nhau nginx


60

Tôi gặp khó khăn trong việc hiểu các vị trí lồng nhau trong nginx. Tôi có hai vị trí có một số chỉ thị cấu hình chung, vì vậy thay vì lặp lại các chỉ thị, tôi muốn lặp lại URI bằng cách sử dụng biểu thức chính quy:

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

Tuy nhiên, điều này mang lại lỗi

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

|Mặc dù không có hoặc có vẻ ổn.

location ~ /a {
        location /a {
        }
}

Tôi đang làm gì sai? Có cách nào tốt hơn để làm điều này mà không lặp lại bất cứ điều gì? Tôi có thể nhóm các địa điểm theo cách khác không?


1
Tại sao nhóm chúng? Tại sao không chỉ là HÔN?
pkhamre


6
bởi vì về mặt logic, chúng được nhóm lại
Jayen

Điều này khiến tôi mất nhiều thời gian để hiểu nhưng cuối cùng tôi đã có thể tạo một danh sách ưu tiên (ish) đơn giản về cách chọn địa điểm .
artfulrobot

Câu trả lời:


101

Câu hỏi cũ, nhưng vấn đề là bởi vì vị trí cha mẹ là một vị trí regex trong khi các vị trí lồng nhau là vị trí tiền tố.

Bạn chỉ có thể xác định vị trí tiền tố lồng nhau khi vị trí cha cũng là vị trí tiền tố:

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

Khi một vị trí cha được xác định bởi một biểu thức chính quy, bất kỳ vị trí lồng nhau nào cũng phải được xác định bởi biểu thức chính:

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

Tuy nhiên, bạn cũng có thể xác định các vị trí regex lồng nhau khi vị trí cha là vị trí tiền tố:

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

Tôi đã bối rối bởi câu đầu tiên của bạn, nhưng ví dụ của bạn có ý nghĩa. Tôi giả sử trong ví dụ cuối cùng, vị trí tiền tố /bsẽ đưa ra một lỗi?
Jayen

13
Đó là câu đầu tiên nên có trong tài liệu .
AndreKR

1
Trong ví dụ đầu tiên, nếu bạn bỏ đi phần location /a { }soạn sẵn - thứ tự có quan trọng không?
Meekohi

2
Ah nevermind tôi hiểu lầm. Các vị trí lồng nhau không kế thừa bất cứ thứ gì từ vị trí cha mẹ của chúng.
Meekohi

Vị trí cha mẹ có thể là một vị trí không phải regex nhưng bất kỳ vị trí lồng nhau nào trong cha mẹ đều phải là regex / non regex.
Mitchell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.