Saya memiliki beberapa titik akhir API yang ingin saya layani di bawah satu lokasi /api
dengan subpath yang menuju ke titik akhir yang berbeda. Secara khusus, saya ingin webdis tersedia di /api
dan API eksklusif tersedia di /api/mypath
.
Saya tidak khawatir tentang bentrokan dengan API webdis karena saya menggunakan subpath yang tidak mungkin berbenturan dengan nama perintah redis, dan juga memiliki kontrol penuh atas desain API untuk menghindari bentrokan.
Ini file konfigurasi dari server pengujian saya yang telah saya peretas:
server {
listen 80;
server_name localhost;
server_name 192.168.3.90;
server_name 127.0.0.1;
location / {
root /home/me/src/phoenix/ui;
index index.html;
}
# temporary hardcoded workaround
location = /api/mypath/about {
proxy_pass http://localhost:3936/v1/about;
}
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:7379/;
}
# tried this but it gives "not found" error
#location ^~ /api/mypath/ {
# rewrite ^/api/mypath/(.*)$ /$1 break;
# proxy_pass http://localhost:3936/v1/;
#}
#
#location ^~ /api {
# rewrite ^/api/(.*)$ /$1 break;
# proxy_pass http://localhost:7379/;
#}
}
Bagaimana saya bisa mengubah solusi saya sehingga setiap permintaan untuk /api/mypath/*
pergi ke titik akhir di port 3936, dan yang lainnya ke port 7379?
nginx
reverse-proxy
hamstar
sumber
sumber
tried this to no avail
? Apa yang terjadi ketika Anda mengaktifkan arahan lokasi itu? Waktu koneksi habis? Lokasi tidak cocok?Jawaban:
Anda tidak perlu menulis ulang untuk ini.
Menurut dokumentasi nginx
Karenanya setiap permintaan yang dimulai dengan
/api/mypath/
akan selalu dilayani oleh blok kedua karena itu adalah lokasi awalan yang paling cocok .Setiap permintaan yang dimulai dengan
/api/
tidak segera diikutimypath/
akan selalu dilayani oleh blok pertama, karena blok kedua tidak cocok, oleh karena itu menjadikan blok pertama lokasi awalan yang paling cocok .sumber
=
,~*
,~
, dan^~
) itu mungkin tampak kontra-intuitif yang^~
tidak termasuk ekspresi reguler (karena~
menunjukkan pertandingan ekspresi reguler) ... Namun, jika Anda ingat,^
di dalam kelas karakter regex (misalnya[^a-z]
) meniadakan bahwa kelas (seperti contohnya berarti (karakter apa pun kecuali yang dari az); demikian pula,^~
meniadakan setiap blok lokasi ekspresi reguler yang potensial.OK menemukan jawabannya, saya pikir kesalahan "tidak ditemukan" berasal dari nginx, tetapi sebenarnya itu berasal dari API saya. Ini solusi saya jika ada yang tertarik:
sumber