Nginx: regex lokasi untuk banyak jalur

30

Saya memiliki dua lokasi di nginx config yang berfungsi:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

Bagaimana saya bisa menggabungkan keduanya menjadi satu lokasi?

Apa yang telah saya lakukan:

Saya mencoba saran ini

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

tapi itu tidak berhasil untukku.

Juga, ketika saya tidak menggunakan backends, konfigurasi berikut berfungsi dengan benar:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

perbarui (beberapa string dari log)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

LARUTAN

Sebenarnya solusi saya tidak bekerja dengan baik:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

dan masalahnya tidak ada hubungannya dengan backend. Sebagai Guido Vaccarella benar memperhatikan itu hanya diikuti setelah location ~ ...yang cocok, sehingga saya location ~ ...tidak punya kesempatan untuk berlari.

Vlad T.
sumber
Saya tidak melihat mengapa izin proxy regex Anda tidak berfungsi. Apa yang terjadi ketika Anda mencobanya?
Grumpy
Ketika saya mencobanya nendex frontend melempar kesalahan 404.
Vlad T.
Apakah) pada akhir pernyataan lokasi hanya kesalahan dalam pertanyaan Anda atau juga dalam file konfigurasi Anda?
Guido Vaccarella
Anda harus memeriksa ulang sisa konfigurasi Anda untuk kesalahan. Selain itu, mungkin ingin menyelidiki mengapa itu melemparkan 404 dengan melihat di mana itu terlihat, apa yang hilang. Mungkin juga ia melempar 404 pada dokumen kesalahan yang tidak ditemukan dan karenanya perlu melihat kesalahan sebelumnya.
Grumpy,
berikan kesalahan dari log kesalahan
Mohammad AbuShady

Jawaban:

30

Menurut dokumentasi nginx :

Kemudian ekspresi reguler diperiksa, sesuai urutan kemunculannya di file konfigurasi. Pencarian ekspresi reguler berakhir pada kecocokan pertama, dan konfigurasi yang sesuai digunakan.

Dalam konfigurasi Anda, lokasi berikut ditentukan sebelum yang dengan proxy_pass dan cocok dengan permintaan file js dan css di bawah statis :

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

Sayangnya klausa "log_not_found off" menonaktifkan pencatatan untuk setiap kesalahan yang tidak ditemukan file yang terkait dengan lokasi ini, itu sebabnya error_log Anda kosong!

Anda dapat mencoba mengomentari lokasi ini atau memindahkannya setelah lokasi dengan proxy_pass (jika Anda memerlukannya untuk file lain yang tidak ada di statis / media ).

Guido Vaccarella
sumber
13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

Seharusnya...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

Penutupan harus berupa kurung {}, bukan kurung kurung ().

Tidak percaya berapa lama untuk melihat itu. Guido benar dari komentar.

Pemarah
sumber
Oh, maaf karena kesalahpahaman, saya pikir itu berarti braket setelah "media" |media)dalam string dimulai dengan "lokasi". Tapi kurung yang salah di sini hanya salah ketik (dikoreksi dalam pertanyaan). Jika tidak, konfigurasi nginx ini tidak akan dimuat dan akan menampilkan kesalahan seperti unexpected ")"...Maaf, lagi.
Vlad T.