Nginx: çoklu yollar için konum regex


30

Nginx config'de çalışan iki konum var:

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

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

Bu ikisini tek bir lokasyonda nasıl birleştirebilirim?

Ne yaptım ben zaten:

Bu öneriyi denedim

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

ama bu benim için çalışmıyor.

Ayrıca, arka uçları kullanmadığımda, aşağıdaki yapılandırma düzgün çalışıyor:

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

güncelleme (kayıttan gelen bazı dizeler)

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$

ÇÖZÜM

Aslında benim çözümüm iyi çalışıyor:

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

ve meselenin arka uçlarla ilgisi yok. Guido Vaccarella'nın doğru bir şekilde fark ettiği gibi location ~ ..., eşleşmeden sonra takip ettim , böylece location ~ ...kaçmaya fırsatım olmadı.


Regex proxy biletinin neden işe yaramadığını anlamıyorum. Deneyince ne olacak?
Huysuz

Bunu denediğimde, ön uç nginx 404 hatası veriyor.
Vlad T.

Location deyiminin sonunda) sorunuzda bir hata mı var yoksa yapılandırma dosyasında da mı var?
Guido Vaccarella

Yapılandırmanızın kalan kısmını hatalar için iki kez kontrol etmelisiniz. Ek olarak, neye baktığını, neyin eksik olduğunu görerek neden 404 attığını araştırmak isteyebilir. Ayrıca bulunamayan hata belgesine 404 atması ve daha önce atılmış bir hataya bakması da mümkündür.
Huysuz

Lütfen hata günlüğündeki hatayı sağlayın
Mohammad AbuShady

Yanıtlar:


30

Nginx belgelerine göre :

Ardından, düzenli ifadeler yapılandırma dosyasındaki görünüm sırasına göre kontrol edilir. Normal ifadelerin araştırması ilk eşleşmede sona erer ve karşılık gelen yapılandırma kullanılır.

Konfigürasyonunuzda, proxy_pass olandan önce aşağıdaki konum tanımlanır ve statik altındaki js ve css dosyalarının isteği ile eşleşir :

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

Ne yazık ki "log_not_found off" yan tümcesi, bu konumla ilgili bulunamayan herhangi bir dosya hatası için günlüğü devre dışı bırakır, bu nedenle error_log dosyanız boş!

Bu konumu yorumlamaya çalışabilir veya proxy_pass ile konumdan sonra taşıyabilirsiniz ( statik / medyada olmayan diğer dosyalar için ihtiyacınız varsa ).


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

Olmalı...

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

Kapanmanın parantez (}) değil, parantez (}) olması gerekir.

Bunu görmenin ne kadar zaman aldığına inanamıyorum. Guido yorumlardan haklıydı.


Yanlış anlaşıldığım için üzgünüm, dizideki "medya" dan sonra |media)"konum" ile başlayan dirsek anlamına geldiğini düşündüm . Ancak buradaki yanlış ayraç sadece bir yazım hatası (söz konusu düzeltilmiş). Aksi takdirde, bu nginx config yüklenmez ve unexpected ")"...tekrar Üzgünüm gibi bir hata verirdi .
Vlad T.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.