Reverse Proxy - Hapus Subdirektori


27

Dalam waktu dekat saya akan memiliki 3 server nginx. Salah satunya adalah proxy terbalik untuk SSL untuk dua lainnya. Jadi, misalnya, saya pergi ke:

https://www.mysitename.com/site1

Dua server lain dalam contoh ini adalah site1 dan site2. Saya menginstal sertifikat SSL pada proksi dan saya ingin menggunakan proksi terbalik (SSL tidak diperlukan karena ketiganya berada di jaringan internal). Untuk tujuan pengujian saya harus mendengarkan nginx pada 443 untuk SSL / reverse-proxy, dengarkan port 8081 yang merupakan aplikasi rel untuk site1, dan 8082 untuk site2.

Aku punya ini...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        proxy_set_header    Host            $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect http:// https://;
    }
}

Jadi ketika saya mengunjungi www.mysitename.com/site1 pada dasarnya saya ingin mengembalikan apa yang biasanya datang dari localhost: 8081 (atau kemudian ke bawah IP internal untuk server lain).

Apakah ada cara untuk menghapusnya "site1" dari panggilan localhost? Apa yang tampaknya dilakukan adalah menggunakan localhost: 8081 / site1. Situs site1 dan site2 bersifat "/ login / index" atau "/ apapun / daftar", dll, tanpa "site1".

Ada juga pengalihan di pengontrol situs (menggunakan redirect_to) yang beralih dari hal-hal seperti / login / index ke / apapun / daftar.

Apakah saya harus mendesain ulang URL situs untuk menggunakan site1? Atau bisakah proxy NGINX mengetahuinya?

Terima kasih.


Untuk Socket.io coba ini cukup tambahkan rewrite /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Jawaban:


53

Mengutip http://nginx.org/r/proxy_pass :

Jika proxy_pass ditentukan dengan URI, saat mengirimkan permintaan ke server, bagian dari URI permintaan dinormalisasi yang cocok dengan lokasi digantikan oleh URI yang ditentukan dalam arahan:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

Artinya, Anda harus menggunakan proxy_passseperti ini:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

Perhatikan trailing /dalam proxy_passdirektif - itu akan menggantikan bagian dari URI asli yang cocok dengan lokasi, yaitu /site1/.


2
Yang dibutuhkan hanyalah garis miring untuk memperbaiki masalah !? Terima kasih untuk itu. Sekarang untuk mencari tahu bagaimana saya akan menangani redirect_to - tapi itu bukan pertanyaan server jadi saya akan mencari tahu di tempat lain.
Chromag

perhatikan, Anda memerlukan garis miring pada URL proxy_pass juga!
Daniel Hill
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.