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?

Jayen
sumber
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 {
        ...
        }
}
Dayo
sumber
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