Nginx: Bagaimana cara meneruskan permintaan http ke port lain?

65

Yang ingin saya lakukan adalah,

Ketika seseorang mengunjungi http://localhost/route/abcrespons server sama persis denganhttp://localhost:9000/abc

Sekarang saya mengkonfigurasi Nginx saya seperti ini:

location /route {
    proxy_pass  http://127.0.0.1:9000;
}

Permintaan http adalah port yang dikirim 9000dengan benar, tetapi jalur yang diterimanya http://localhost:9000/route/abctidak http://localhost:9000/abc.

Ada saran ?

MrROY
sumber

Jawaban:

65

Saya benci kehalusan di sini, tetapi coba tambahkan a / pada akhir 9000 seperti di bawah ini. Itu tidak akan lagi menambahkan "rute" ke permintaan yang diteruskan sekarang.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
Hiu
sumber
4
Ini harus menjadi jawaban yang diterima. Cukup menambahkan /didokumentasikan dengan baik sebagai cara untuk menghapus awalan yang terdaftar di lokasi.
Bernard
40

Saya yakin Anda dapat menggunakan penulisan ulang untuk menghapus bagian tambahan dari URL. Dalam kasus Anda, saya pikir Anda dapat menggunakan:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Namun jika aplikasi Anda memiliki tautan internal di dalamnya, mereka mungkin masih menunjuk ke / abc / foo, dan jika Anda melakukan ini mereka malah harus menunjuk ke / route / abc / foo sehingga permintaan mentah masuk dengan benar. Anda mungkin lebih baik meninggalkan nginx config apa adanya dan alih-alih mengonfigurasi aplikasi Anda agar menyadarinya tinggal di subdirektori, jika Anda bisa.

Saya tahu ini adalah pertanyaan lama, tapi itu adalah hit google teratas bagi saya ketika saya mencoba untuk menyelesaikan masalah yang sama!

pengguna2428107
sumber
Terima kasih! dalam tautan ini kita dapat meninjau daftar variabel: wiki.nginx.org/HttpProxyModule#Variables
Edgard Leal
17

Coba yang berikut ini

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
ALex_hha
sumber
Solusi ini bekerja paling baik untuk saya, karena mempertahankan nama host.
Shafique Jamal
Bersih dan sederhana.
Ravshan Samandarov
7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

Kode ini mendengarkan 8080 dan mengarahkan ulang ke port 8787 pada compute-1-36. Anda dapat memilih jalur lain di lokasi /

pengguna3266656
sumber