Soru Nginx ters proxy + URL yeniden yazma


Nginx 80 numaralı bağlantı noktasında çalışıyor ve proxy URL'lerini yol ile tersine çevirmek için kullanıyorum /foo limana 3200 bu yoldan:

location /foo {
                proxy_pass http://localhost:3200;
                proxy_redirect     off;
                proxy_set_header   Host $host;
}

Bu iyi çalışıyor, ancak limanda bir uygulama var 3200İlk başta istemediğim /foo gönderilecek. Yani - eriştiğimde http://localhost/foo/barSadece istiyorum /bar uygulama tarafından alınan yol olmak. Bu yüzden bu satırı yukarıdaki konum bloğuna eklemeyi denedim:

rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;

Bu, 302 yönlendirmesine (URL'de değişiklik) neden olur, ancak 301 istiyorum. Ne yapmalıyım?


95
2018-04-15 17:31


Menşei


Grafana ile ilgili herhangi bir sorununuz varsa, bu tarifi kullanmalısınız: docs.grafana.org/installation/behind_proxy/... - mohsen saeedi


Cevaplar:


Localhost'a yapılan herhangi bir yönlendirme, uzak bir sistemden (örneğin, müşterinin Web tarayıcısı) mantıklı değildir. Böylece bayrakları yeniden yaz daimi (301) veya yönlendirme (302) sizin durumunuzda kullanılamaz.

Lütfen şeffaf bir yeniden yazma kuralını kullanarak kurulumu takip etmeyi deneyin:

location  /foo {
  rewrite /foo/(.*) /$1  break;
  proxy_pass         http://localhost:3200;
  proxy_redirect     off;
  proxy_set_header   Host $host;
}

kullanım curl -i yeniden yazmalarını test etmek için. Kural için çok ince bir değişiklik, nginx'in bir yönlendirme yapmasına neden olabilir.


118
2018-04-15 17:56



Bunu yaptığımda URL yolum hala uygulamamda / foo ile başlıyor ... - jeffreyveon
Farklı bir sorun olmalı. Bu senaryoyu birkaç dakika önce başarıyla ürettim. Orijinal URL: http: // geliştirme / foo / TestMe / 1234 - Proxy arka ucu olarak bağlı bir Apache üzerinde çalışan bir PHP betiğinin REQUEST_URI'si: '/ testme / 1234' - Jens Bradler
Regex muhtemelen olmalı /foo(.*), aksi takdirde example.com/foo eşleşmeyecek. (muhtemelen jeffreyveon deneyimlidir) - Benno
Bu tür işler, ama proxy_set_body ile ayarlı olduğum bedenim kaldırılıyor. - Justin Thomas
yeniden yazmak /(.*) /socket.io/ break; SOCKET.IO İÇİN GÜNÜMÜZÜ KAYDEDİN - user956584


Basit konum önek eşlemesi, proxy_pass yönergesinde bir URI belirttiğiniz sürece bir yeniden yazma kuralı kullanmadan bunun için çalışır:

location /foo {
  proxy_pass http://localhost:3200/;
}

Ek dikkat edin / sonunda proxy_pass direktif. NGINX eşleşen öneki şeritleyecek /foo ve geri kalanını URI'daki arka uç sunucusuna geçirin /. Bu nedenle, http://myserver:80/foo/bar arka ucunda yayınlanacak http://localhost:3200/bar.

İtibaren Proxy_pass üzerindeki NGINX dokümanları:

Proxy_pass yönergesi bir URI ile belirtilirse, o zaman   istek, normalleştirilmiş istek URI'sinin bir bölümüne sunucuya iletilir   Konumu eşlemek, yönergede belirtilen bir URI ile değiştirilir:


88
2017-09-29 03:30



Benim için çalıştığım / yere / foo / {ekledim - Andrei N
Bu tam olarak aradığım şeydi! - anbiniyar
Bu çok temiz bir çözüm, bu soruya kanonik bir cevap olmasını tercih ederim. - ralien
Sondaki eğik çizgiyi tutmanın veya kaldırmanın önemini anlamak için çok uzun sürdü. - Parvez
Bu aslında geçecek //xyz bunu yaparsan ev sahibine. - Archimedes Trajano


Mutlak en doğru yol ve en iyi uygulama genellikle aşağıdaki gibidir:

location /foo/ {
    proxy_pass http://localhost:3200/; # note the trailing slash!
}

  • Korkunç önemi dikkat edin sondaki çizgi proxy_passotomatik olarak değiştiren $uri değişken olması /foo/ ön uç ile uyuşuyor / arka uçta. Açıklığa gerek yok rewrite direktif.

  • Ayrıca, unutmayın ki sondaki / içinde location o da oldukça önemlidir - o olmadan, sitenizde bir noktada garip görünen URL'ler bulundurma riskiniz var (örneğin, bir çalışma /fooen ek olarak /foo/en).

    Ek olarak, sondaki / içinde location ile proxy_pass ayrıca bazı sağlar özel işlembelgelerine göre location Direktif, etkili bir şekilde örtülü location = /foo {return 301 /foo/;} de.

    Yani, bir location yukarıdaki gibi eğik çizgi ile, sadece eğik çizgi ekleri gibi /fooen geçerli olmayacak, aynı zamanda /foo izsiz bir eğik çizgi olmadan da çalışmaya devam edecektir.


Referans belgeleri:


31
2017-08-26 21:12



Burada en iyi cevap budur! - Mo Friedrich
Benziyor $args kayıp: http://frontend/foo?bar=baz proxy edilecek http://backend/. Hataların URL'nin parçası olmadığına dikkat edin - Vanuan
@Vanuan, bundan emin misin? Oldukça eminim $args Yukarıdaki kodu kullandığınız halde, ayrı oldukları gibi, yine de uygun şekilde ele alınmalıdır. $urive açık değişkenler kullanmıyorsanız, tekrar bir araya getirilmelidir. proxy_pass. - cnst
@ArchimedesTrajano, yanlışsınız, çünkü /foo yönlendirmek /foo/Yani, arka ucunda garip bir şey yapmıyorsanız bile /foo istekleri hala yukarıdaki kod ile çalışacaktır. (Bu aslında cevabın bir parçası, btw.) - cnst
Bu en iyi cevap! Bu hareket etmeli. - phegde


Deneyin

location /foo {
    proxy_pass http://localhost:3200/;
    ....

veya

location ^~ /foo {
    proxy_pass http://localhost:3200/;
    ....

0
2018-01-21 16:20



Yukarıdaki gibi yapılandırılmasının neden bir açıklaması varsa, bu cevap iyi olur. - masegaloeh
Bu aslında geçecek //xyz bunu yaparsan ev sahibine. - Archimedes Trajano