lokasi bersarang nginx


60

Saya mengalami kesulitan memahami lokasi bersarang di nginx. Saya memiliki dua lokasi dengan beberapa petunjuk konfigurasi yang sama, jadi daripada mengulangi arahan, saya lebih suka mengulangi URI menggunakan ekspresi reguler:

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

Namun, ini memberikan kesalahan

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

Tanpa atau |sepertinya tidak apa-apa.

location ~ /a {
        location /a {
        }
}

Apa yang saya lakukan salah? Apakah ada cara yang lebih baik untuk melakukan ini tanpa mengulangi apa pun? Bisakah saya mengelompokkan lokasi dengan cara lain?


1
Mengapa mengelompokkan mereka? Kenapa tidak hanya CIUMAN?
pkhamre


6
karena secara logis mereka dikelompokkan
Jayen

Ini butuh waktu lama untuk saya mengerti tetapi pada akhirnya saya bisa membuat daftar prioritas (ish) sederhana tentang bagaimana lokasi dipilih .
artfulrobot

Jawaban:


101

Pertanyaan lama, tetapi masalahnya adalah karena lokasi induk adalah lokasi regex sedangkan lokasi bersarang adalah lokasi awalan.

Anda hanya dapat menetapkan lokasi awalan bersarang saat lokasi induk juga merupakan lokasi awalan:

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

Ketika lokasi induk ditentukan oleh regex, setiap lokasi bersarang juga harus ditentukan oleh regex:

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

Namun, Anda juga dapat menentukan lokasi regex bersarang saat lokasi induk adalah lokasi awalan:

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

Saya bingung dengan kalimat pertama Anda, tetapi contoh Anda masuk akal. Saya berasumsi dalam contoh terakhir, lokasi awalan /bakan menimbulkan kesalahan?
Jayen

13
Kalimat pertama itu harus ada dalam dokumentasi .
AndreKR

1
Pada contoh pertama, jika Anda meninggalkan location /a { }pelat - apakah pesanan itu penting?
Meekohi

2
Ah tidak pernah salah paham. Lokasi bersarang tidak mewarisi apa pun dari lokasi induknya.
Meekohi

Lokasi induk dapat menjadi lokasi non regex tetapi beberapa lokasi bersarang di dalam induk harus semuanya menjadi regex / non regex.
MitchellK
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.