Nginx konum regex proxy geçişi ile çalışmıyor


43

Bu 2 konum direktifini Nginx'te çalıştırmaya çalışıyorum ancak Nginx'i yeniden başlatırken bazı hatalar alıyorum.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Bu alıyorum hatadır:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

Kimseye tanıdık geliyor mu? Neyi özlüyorum burada?

Yanıtlar:


48

Xaviar'ın büyük cevabına küçük bir ek :

Eğer nginx hakkında bu kadar iyi bilgi sahibi değilseniz, eğik çizgiyi proxy_passyönergenin sonuna eklemek arasında önemli bir fark vardır .

Aşağıdaki çalışmıyor :

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

ama bu bir:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

Aradaki fark direktifin /sonundadır proxy_pass.


1
Bu /olay benim yapılandırma problemimi düzeltti, yakalamak zordu, teşekkürler!
saat

Beni delirtiyordu, gösterdiğin için teşekkürler!
cyrrill

20

O size söyler URI vekil geçiş yönergede regex konumda kullanılamaz. Bunun nedeni, nginx'in URI'nin locationbloğundaki regex ile eşleştiren kısmı , proxy_passyönergeye genel bir şekilde geçen ile değiştirememesidir.

Basitçe konum regex hayal /foo/(.*)/barve belirttiğiniz proxy_pass http://server/testsen ile sona istemiyorum çünkü nginx bir üst düzeyde yerine başka bir yere düzenli ifade haritaya olurdu, /foo/test/bar/somethingancak birlikte /test/something. Yani bu doğal olarak mümkün değil.

Yani bu kısım için aşağıdakileri kullanmalısınız:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Ancak, konum bloğu URI modeliyle eşleşmesi için yönlendirmeleri yeniden yazmak mümkün olmayacaktır çünkü işlenmekte olan URI'yi yeniden yazar, böylece yeniden yazmadan önce ilk isteğiLocation temel alarak başlığın değiştirilmesini imkansız hale getirir .


2
yolu yeniden yazma kuralına taşımak benim için işe yaradı. Teşekkürler.
sonjz
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.