Di Nginx kami telah mencoba mengarahkan ulang URL sebagai berikut:
http://example.com/some/path -> http://192.168.1.24
di mana pengguna masih melihat URL asli di browser mereka. Setelah pengguna diarahkan, misalkan mereka mengklik tautan /section/index.html
, kami ingin ini membuat permintaan yang mengarah ke pengalihan
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
dan sekali lagi masih mempertahankan URL asli.
Upaya kami telah melibatkan berbagai solusi menggunakan proxy dan aturan penulisan ulang, dan di bawah ini menunjukkan konfigurasi yang telah membawa kami paling dekat ke solusi (perhatikan bahwa ini adalah konfigurasi server web untuk example.com
server web). Namun, masih ada dua masalah dengan ini:
- Itu tidak melakukan penulisan ulang dengan benar, karena URL permintaan yang diterima oleh server web
http://192.168.1.24
termasuk/some/path
dan karena itu gagal untuk melayani halaman yang diperlukan. Saat Anda mengarahkan kursor ke tautan setelah halaman disajikan,
/some/path
hilang dari URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Kami mencari solusi yang hanya melibatkan pengubahan konfigurasi server web example.com
. Kami dapat mengubah konfigurasi pada 192.168.1.24
(juga Nginx), namun kami ingin mencoba dan menghindari ini karena kami perlu mengulangi pengaturan ini untuk ratusan server yang berbeda yang aksesnya diproksikan melalui example.com
.
root
di dalamlocation
blok, maka Anda tidak akan mendapatkan perilaku yang tidak terduga untuk lokasi default. Hanya jika Anda perlu mengubah defaultroot
untuk setiap lokasi, maka Anda dapat menggunakannya.Anda harus menggunakan bagian URI dalam
proxy_pass
arahan. Juga, Anda campur aduk argumenproxy_redirect
arahan, dan mungkin Anda tidak membutuhkannya sama sekali. Nginx memiliki standar yang masuk akal untuk arahan ini.Dalam hal ini,
location
blok Anda bisa sangat sederhana:sumber
/some/path/
bagian dari URL disimpan dalam permintaan yang bukan URL yang valid (kita perlu menulis ulang URL juga untuk menghapus ini).Anda dapat menggunakan konfigurasi berikut untuk memiliki pemetaan mulus 100% antara
/some/path/
di front-end dan/
di backend.Perhatikan bahwa ini adalah satu-satunya jawaban sejauh ini yang juga akan menjaga
404 Not Found
kesalahan jalur mutlak menghasilkan kesalahan, asalkanReferer
header HTTP yang benar dikirim oleh browser, jadi, semua gif harus terus memuat tanpa perlu memodifikasi HTML yang mendasarinya (yang tidak hanya mahal, tetapi juga tidak didukung tanpa modul tambahan tidak dikompilasi secara default).Anda dapat menemukan bukti-konsep-lengkap dan produk minimal-layak dalam https://github.com/cnst/StackOverflow.cnst.nginx.conf repositori.
Berikut ini adalah uji coba untuk mengonfirmasi bahwa semua kasus tepi tampaknya berfungsi:
NB. Jika Anda memiliki banyak jalur berbeda untuk dipetakan, maka alih-alih melakukan perbandingan regex
$http_referer
diif
dalamlocation @404
, Anda mungkin ingin menggunakanmap
arahan berbasis global sebagai gantinya.Perhatikan juga bahwa garis miring di kedua
proxy_pass
, dan juga dilocation
dalamnya, cukup penting sesuai jawaban terkait .Referensi:
sumber
Ketika garis miring ditambahkan ke jenkins proksi nginx, Anda akan disajikan dengan kesalahan "Tampaknya pengaturan proxy terbalik Anda rusak".
Itu harus dibaca
sumber