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 ?

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/;
}

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!


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;
}

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 /

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.